1. 程式人生 > >qemu-TCG動態翻譯技術

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。