日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qemu学习笔记

發布時間:2023/12/20 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qemu学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Qemu 學習筆記

  • Qemu
  • Qemu的主要原理與機制
    • Qemu的兩種運行模式
  • Qemu的主要執行流程

Qemu

開門見山,Qemu可以看成一款虛擬機,他可以模擬很多CPU架構。比如Alpha, ARM, Cris, i386, M68K, PPC, Sparc, Mips等;以及大部分的硬件設備,也就可以模擬出不同的目標系統。

Qemu的主要原理與機制

Qemu可以實現目標平臺的仿真,但是arm平臺的程序怎么能在我們電腦上運行呢?這是Qemu主要要做的事情,翻譯,那如何進行翻譯呢。大致上就是下面這樣:

客戶代碼 ——>中間代碼 ——> 主機代碼

那就會有人問了為什么要轉換成中間代碼,直接轉換成主機代碼不香嗎?問得好。
在Qemu中執行翻譯這部分流程的是TCG模塊,因為Qemu是支持跨平臺的,他不僅可以在linux下執行arm的程序還可以在ppc下等等不同的平臺下執行,這里為了通用性方面的考慮,先轉換成中間代碼,在將中間代碼轉換成主機代碼。

Qemu的兩種運行模式

Qemu 有兩種運行模式,一種是全系統模擬(system mode),一種是用戶態模擬(user mode)。
從名字就可以看出來system mode肯定是模擬全了,可以直接跑操作系統之類的。user mode肯定就弱一點,跑個進程之類的。
放個圖吧,兩種用戶態模式:

Qemu的主要執行流程

我的Qemu版本是2.7.0,這里的執行流程是user mode

1.入口函數在vl.c
main()函數,這是qemu的入口,包含了虛擬機的初始化過程
2.在main()函數中有一個main_loop()的函數,這就是我們的主進程
qemu里面每模擬一個架構就會生成一個線程,由main_loop函數進行監視

3.接下來就是我們如何生成這個線程,qemu會自動根據運行程序的架構來判斷進行CPU的初始化,這塊有興趣可以了解一下binfmt_misc,這塊我以arm為例
3.1 進入cpu_arm_int()這里就是進行CPU的初始化


3.2這里不涉及到kvm,具體想了解什么是kvm的可以自行百度

3.3 創建一個cpu線程,且在線程中循環執行tcg_exec_all(),這里就正式步入翻譯流程


4.進入tcg_cpu_exec(),這幾步都是設置cpu的狀態所以就跳過了,
tcg_cpu_exec() ——>cpu_exec().

5.進入正題cpu_exec(),這里主要是處理中斷異常, 找到代碼翻譯塊。tcg每次的翻譯都是以TB為單位進行,也就是說如果一個TB中有跳轉的話,也是最后一條指令。TCG會將翻譯好的塊存起來放到cache中,在需要的時候先從cache中找,如果找不到的話在執行翻譯過程。
處理這一步的函數是tb_find_fast()

tb_find_slow屬于沒有在cache中找到對應的TB,所以執行翻譯的程序,當cache滿掉后會清空整個cache重新生成。在tb_find_slow()中有一個tb_gen_code() 這個函數執行翻譯過程,先設置tb得上下文,主要得翻譯函數為gen_intermediate_code();

調用該函數將客戶代碼轉換為TCG操作碼

接下來是tcg_gen_code()太長了,我就截個名吧,就在gen_intermediate_code()后順序執行就可以找到。

這個函數就是個因果函數我把客戶代碼轉換成中間代碼了,接下來就需要將中間代碼轉化為主機代碼 tcg_gen_code就是實現了這個作用。

6.在執行完tb_find_slow()之后會繼續執行tb_find_fast()進行查找然后就是執行部分了
調用了cpu_loop_exec_tb()這部分開始就是執行了

之后我們下次在分析,休息休息。

總結

以上是生活随笔為你收集整理的Qemu学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。