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的核心,主要实现了以下翻译流程: