由於剛剛接觸qemu,所以前面幾篇文章僅僅是膚淺的介紹qemu的一些背景知識,今天突然感覺前面說的太沒有條理了,而且大部分是讀別人的文章,一知半解,沒有自己的總結體會,今天感覺稍微有點心得,敬請指教。
1. 明確guest和host
對於qemu而言,被**的平台成為guest或者說target;很明顯,執行qemu的平台就稱為host。
2. 了解qemu動態翻譯技術的發展
qemu運用動態翻譯的技術將guest binary instructions動態翻譯成host binary instructions,之後由host執行翻譯後的指令。在qemu-0.9之前的版本都採用dyngen的動態翻譯技術,而從qemu-0.10開始的版本開始採用tcg(tiny code generator)的翻譯技術。
採用dyngen 動態翻譯技術的資料主要有以下兩篇文章,是了解動態翻譯技術入門的好文章(在後續的分析中,會簡單介紹dyngen技術):
介紹tcg技術的文章則相對較少,主要是閱讀qemu原始碼和qemu官網上的相關資料。
3. dyngen簡單介紹
圖1簡單說明了qemu採用dyngen動態翻譯技術將目標平台指令翻譯成主機平台指令的簡單過程。
假設target為powerpc,host為x86,說明整個翻譯過程:
dyngen在整個過程中扮演了非常重要的角色,其詳細功能在這裡不再詳述,但是有乙個疑問,希望與大家討論:
在將目標平台指令集向micro-operations這一步的轉化中,《qemu, a fast and portable dynamic translator》一文中提到採用了hand coded code的方式,我理解是我們說的「硬編碼」,即目標平台指令到micro-op是預先寫好的一一對映的關係,我的疑問就是這種一一對映的關係是怎麼實現的,因為沒有看過qemu-0.9之前版本的**,所以很想知道是怎麼hand coded 的。另外,該文還提到「when qemu first encounters a piece of target code, it translates it to host code ... ....」, 我的問題是qemu怎麼處理目標平台的objective file的, 比方說qemu怎麼分析乙個elf檔案,怎麼從中讀取指令,怎麼來進行後面的hand coded ????
在dyngen動態翻譯技術中,還涉及到幾個比較重要的地方,比如:
(1)tbs,translated blocks
qemu將tb定義為碰到下乙個jump指令或修改cpu state的指令之前的所有**稱為乙個tb
(2)暫存器分配
target平台的暫存器被對映到host的固定暫存器或指定的記憶體位址
(3)條件**的優化
(4)tb塊以hash表的形式組織
(5)mmap()系統呼叫**target的mmu
(6)longjmp()實現異常**
(7)非同步輪詢的方式實現中斷的** 至於
(3)~(7)的具體實現方式,現在還比較模糊,希望與大家交流!!!!!!!!!
4. tcg簡單介紹
tcg是qemu的核心,主要實現了以下翻譯流程:
guest binary instructions -> tcg ir -> host binary instructions tcg 定義了一組ir(intermediate representation),這些ir大致可以分為以下幾類:
- mov類操作: mov, movi, ... - 邏輯操作: and, or, xor, shl, shr, ... - 算術操作: add, sub, mul, div, ... - 分支跳轉操作: jmp, br, brcond - 函式呼叫: call - 記憶體操作: ld, st - qemu的特殊操作: tb_exit, goto_tb, qemu_ld/qemu_st
翻譯漫談筆記之2科技翻譯的特點
1.科技文獻通常是用來講道理的,所以譯者必須準確理解文字表達的道理 2.科技翻譯的譯者完全可以適當改動原文 3.在 順 與 信 發生衝突時,科技翻譯選擇信而不順 4.科技翻譯時,譯者應當對加倍小心應對專有名詞 術語 case sensitive 能區分大小寫 plug and play 即插即用 c...
chaper34動態呼叫有參與方法過載技術
源 實體類 實體類 被分析的物件 using system using system.collections.generic using system.linq using system.text namespace 反射技術呼叫指定類無參方法 set 方法 public void displayi...
ASP動態網頁生成靜態Html網頁檔案技術
filename test.htm if request body then set fso server.createobject scripting.filesystemobject htmlwrite.write html head title request.form title title...