qemu原始碼分析之五 TCG動態翻譯技術

2021-08-26 06:59:21 字數 1524 閱讀 8994

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。

QEMU原始碼分析系列 一)

1 qemu概述 qemu是一種快速的多體系結構 器,通過動態翻譯的技術達到了優異的 速度。目前,qemu支援兩種操作模式 對於全系統 模式,qemu目前可以支援的硬體列表如下 對於使用者態 模式,qemu支援的硬體列表如下 x86 32 and 64 bit powerpc 32 and 64 b...

qemu原始碼分析系列 二

在qemu原始碼分析系列 一 簡單介紹了下qemu相關的背景知識,本文將詳細分析qemu的核心 動態翻譯器。為了更容易理解動態翻譯技術,我們暫時忽略掉qemu的其他模組,如使用者互動模組,硬體模擬等模組,而是從資料結構的設計,資料結構之間的操作及其應用等方面來進行詳細地分析,重點關注動態翻譯器和微操...

qemu原始碼分析系列 二

在qemu原始碼分析系列 一 簡單介紹了下qemu相關的背景知識,本文將詳細分析qemu的核心 動態翻譯器。為了更容易理解動態翻譯技術,我們暫時忽略掉qemu的其他模組,如使用者互動模組,硬體模擬等模組,而是從資料結構的設計,資料結構之間的操作及其應用等方面來進行詳細地分析,重點關注動態翻譯器和微操...