1. 程式人生 > >qemu原始碼分析之四--dyngen動態翻譯技術

qemu原始碼分析之四--dyngen動態翻譯技術

    由於剛剛接觸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技術):

  •   QEMU, a Fast and Portable Dynamic Translator
  •  Porting QEMU to Plan 9: QEMU Internals and Port Strategy

    介紹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)的具體實現方式,現在還比較模糊,希望與大家交流!!!!!!!!!