Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3317049
  • 博文数量: 258
  • 博客积分: 9440
  • 博客等级: 少将
  • 技术积分: 6998
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-03 10:28
个人简介

-- linux爱好者,业余时间热衷于分析linux内核源码 -- 目前主要研究云计算和虚拟化相关的技术,主要包括libvirt/qemu,openstack,opennebula架构和源码分析。 -- 第五届云计算大会演讲嘉宾 微博:@Marshal-Liu

文章分类

全部博文(258)

文章存档

2016年(1)

2015年(4)

2014年(16)

2013年(22)

2012年(41)

2011年(59)

2010年(40)

2009年(75)

分类: LINUX

2011-10-12 20:37:18

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源码的角度详细分析x86-->x86平台的TCG动态翻译技术的执行过程。

阅读(3996) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~