qemu-TCG動態翻譯技術
1. TCG簡單介紹
TCG(Tiny Code Generator)最早被用於C編譯器的後端。在TCG相關的程式碼中,target指的是我們通常說的host,這一點需要注意,並不是我們理解的被模擬的平臺。
2. TCG動態翻譯技術的幾個概念
(1)與dyngen一樣,TCG的“function”與qemu的TBs(Translated Block)相對應,即以分支跳轉指令結束的程式碼段。
(2)TCG中有三種變數:temporary, local temporary, global。這三種變數有著不同的生命週期,temporary變數的宣告週期是TBs,local temporary變數的宣告週期是functions,global變數的宣告週期是所有的functions,類似C語言的全域性變數。temporary和local temporary變數通常在function內定義,global變數通常在function外定義。全域性變數通常被對映到某個記憶體地址或某個固定的暫存器。
3. TCG operations
就像dyngen動態翻譯技術中的micro-operations一樣,TCG也採用中間表示的形式(TCG instructions),TCG至中間表示支援的三種變數有兩種資料型別:32 bit整型和64 bit整型。另外,指標型別被實現為整型的別名。
TCG指令有固定的形式:
TCG 操作碼 輸出變數域,輸入變數域,常量域
比較特殊的是call指令,其後只跟一個變數,同時作為輸出和輸入變數域。
舉個例子:
add_i32 t0, t1, t2 (t0 <- t1 + t2)
操作碼 輸出變數域 輸入變數域 常量域(輸入)
4. 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 這裡僅對TCG中間表示做一下簡單分類,至於每條TCG指令的具體用法,參見qemu原始碼tcg/readme。 5. TCG 動態翻譯過程 前面也提到TCG主要實現以下翻譯過程: guest binary instructions -> TCG IR -> host binary instructions 在qemu原始碼中,target-ARCH/* 定義瞭如何將guest binary instructions 反彙編成 TCG IR,tcg/ARCH 定義瞭如何將 TCG IR 翻譯成 host binary instructions。