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()這部分開始就是執行了
 
 之后我們下次在分析,休息休息。
總結
 
                            
                        - 上一篇: 当前安全设置不允许下载该文件的原因以及图
- 下一篇: 三相电 三相 插座 插头 线缆 颜色 详
