[译]Qemu Dynamic Translator论文

Tittle

QEMU, a Fast and Portable Dynamic Translator

Abstract

  • qemu可以模拟多种CPU, 支持full system emulation,无需修改待模拟的操作系统
  • 支持linux user mode模拟

Introduction

  • Qemu可以在不同的host上面运行,包括:
    • Linux
    • Windows
    • Mac OS X
  • Qemu支持target操作系统的的无修改运行
  • Qemu主要用来运行操作系统,debug等功能
  • Qemu集成了一个user mode的模拟器,它使用linux的一个process,作为一个target CPU.这可以用来测试cross compiler的结果。
  • Qemu支持的子系统包括:
    • CPU emulator
    • emulated devices(VGA, serial port, keyboard, mouse, IDE hard disk, network card, ...)
    • Generic devices(block device, character device, network device),用来连接模拟设备和对应的host devices.
    • Machine描述用来初始化模拟设备
    • debugger
    • user interface
  • 这篇文章主要讲dynamic translator,它用来 performs a runtime conversiont of target CPU instructions into the host instruction set.
  • dynamic translator的结果放到一个translation cache里边,可以重用
  • 他与interpreter的不同是target instructions只用fetch/decode一次
  • Qemu的dynamic translator是可移植的,他只是把GCC offline产生的machine code连接到了一块儿而已
  • CPU emulator的难题:
    • code cache management
    • register allocation
    • condition code optimization
    • direct block chaining
    • memory management
    • self-modifying code support
    • exception support
    • hardware interrupts
    • user mode emulation

Protable dynamic translation

描述

  • 首先,要把target CPU instruction split into simpler instructions called micro operations. 这些macro operation由小的C code组成,由GCC编译成object file。
  • micro operation的数量为几百个,由target CPU instruction转成micro operation完全由hand coded code组成
  • 编译攻击叫做dyngen:它读取object file产生dynamic code generator(它会被运行时调用,用来产生host function)
  • 过程与[1]类似,但是工作主要实在编译期做的。

A key idea is that in QEMU const parameters can be given to micro operations. For that purpose, dummy code relocations are generated with GCC for each constant parameter. This enable dyngen tool to locate the relocations and generate the appropriate C code to resolve them when building the dynamic code. Relocations are also supported to enable references to static data and to oher functions in the micro operations.

例子

  • 如何把PowerPC指令addi r1, r1, -16 # r1 = r1 - 16转换成x86指令呢?
  • PowerPC code translator会产生如下的micro operations:
movl_T0_r1        # T0 = r1
addl_T0_im -16    # T0 = T0 - 16
movl_r1_T0        # r1 = T0
  • 上面三条micro对应的代码如下所示(env表示target CPU的state, 32个ppc寄存器存在env->regs[32]里边):
void op_movl_T0_r1(void)
{
     T0 = env->regs[1];
}

extern int __op_param1;
void op_add1_T0_im(void)
{
    T0 = T0 + ((long)(&__op_param1));
}
  • dygen产生的micro operation stream用指针opc_ptr指出,gen_code_ptr指向output的host code。micro operation的参数用opparam_ptr指出,逻辑流程如下:
for (;;) {
  switch(*opc_ptr++) {
  case INDEX_op_movl_T0_r1: {
    extern void op_mov1_T0_r1();
    memcpy(gen_code_ptr, (char *)&op_movl_T0_r1 + 0, 3);
    gen_code_ptr += 3;
    break;
  }
  case INDEX_op_add1_T0_im: {
    long param1;
    extern void op_addl_T0_im();
    memcpy(gen_code_ptr, (char *)&op_addl_T0_im+0, 6);
    param1 = *opparam_ptr++;
    *(uint32_t *)(gen_code_ptr + 2) = param1;
    gen_code_ptr += 6;
    break;
  }
  [...]
  }
  [...]
}
  • 对于大多数的micro operation,比如movl_T0_r1,只用把GCC产生的code copy过去就行了
  • 当使用const parameters的时候,dyngen利用GCC产生的relocation在runtime对parameter进行patch。
  • 比如上面的三条指令产生的host code如下所示。
# movl_T0_r1
# ebx = env->reg[1]
mov 0x4(%ebp), %ebx
# add1_T0_im - 16
# ebx = ebx - 16
add $0xfffffff0, %ebx
# movl_r1_T0
# env->regs[1] = ebx
mov %ebx, 0x4(%ebp)

Dyngen的实现

  • 解析object file的符号表,relocation entries和code section。
  • 用symbol table找到micro operation对应的code section的code。用host specific method 找到需要copy的code的start和end,function的prologue和epilogue通常被省略。
  • 每条micro operations的relocations都要被examined,用来获得const parameter的个数。怎么知道那个relocation是相关的呢?使用了特殊的symbol name来标示:__op_paramN。
  • memcpy micro operation code到output area。如果由const parameter还有利用relocation对copy的code进行patch。
  • 对特殊的平台比如ARM,要进行一次统一的relocate,处理consts。
  • prologue和epilogue要处理掉,为了方便处理,A dummy assembly macro forces GCC to always terminate the function corresponding to each micro with a single return instruction。要看代码才知道什么意思。

实现细节

Translated Blocks and Translated Cache

  • 用basic block定义translated block,QEMU会把知道遇到next jump/modify static CPU state的指令为止。
  • 用16MB的cache储存最近使用的TBs,满的时候全部flush
  • static CPU state是指进入TB的时候CPU的state

Register allocation

  • 使用fixed register allocation,也就是说target CPU的register被英射雕固定的host register/memory address。
  • 大多数的host,我们都会把registers map到memory上,把临时变量储存在host registers。
  • temporary variables的分配也是被hard coded到每个target CPU的。
  • 未来可能使用dynamic temporary register allocator

Condition code optimizations

  • condition code的模拟关乎性能
  • Qemu使用lazy condition code模拟:不计算每个指令的condition code,只存储数据和操作符,这样,用到condition code的指令可以重新计算上一个影响condition code的数据,以恢复condition code。
  • translation time可以进一步优化

Direct block chainning

  • 当前TB执行完毕后,Qemu使用hash table,PC和static CPU state找到下一个TB:如果没有生产就开始translate,如果生成了就直接执行
  • 如果the new simulated PC is known(for example after a condition jump), Qemu can patch a TB so that it jumps directly to the next one.
  • 间接跳转的code portable能力更强,一些host上,branch指令会直接被patch,以让block chainning 没有overhead。

Memory management

  • 对于system emulation,QEMU使用mmap()模拟target MMU
  • 支持software MMU,模拟physical MMU,这时候使用了address translation cache加速

自修改code和code invalidation

  • 大多数平台上方便实现,只用把icache invalidate掉就行
  • x86不能icache invalidate。当TB翻译完后,相应的host page如果不是已经read only就被写保护。如果再次write,那么QEMU就把该page的所有code都invalidate掉,然后开启write access权限
  • 一个page的所有TB被用list连起来,这样就很方便的进行上面的page invalidate操作

异常支持

  • 用longjump()实现跳转
  • 不是要software MMU的话,异常memory访问会被host 捕捉
  • QEMU也支持精确异常,因为发生异常时候的CPU状态是已知的

硬件中断

  • Qemu不是在每个TB执行的时候都检查hardware interrupt的pending状态。
  • user要异步的call function来判断是否有中断pending。这个function会reset TB,然后快速返回main loop,然后main loop执行它。

User mode emulation

  • 不支持MMU模拟
  • 自动大小端转换
  • target thread与host thread一一对应

Porting work

  • dyngen
  • tempory variables要映射到host的registers上
  • host cpu的icache和memory同步指令
  • 为了直接连接跳转的模块,需要提供汇编宏
  • QEMU移植的难度和dynamic linker的难度相当

Performance

  • integer慢4倍
  • float慢10倍
  • full system用software MMu慢两倍
  • 比bochs快30倍
  • 比valgrind快1.2倍

总结和未来工作

  • cache simulation and cycle counters could be added to make a debugger as in SIMICS这个实现了没呢?

References

[1] Optimizing direct threaded code by selective inlining.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
    Gibbs基阅读 37,098评论 8 114
  • ping error: Destination off-link but no route作者 codercjg ...
    codercjg阅读 1,027评论 0 1
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,678评论 0 9
  • 这份文档旨在帮助开发者理解 QEMU 构建系统的架构。正如使用 GNU autotools 的项目一样,QEMU ...
    hanpfei阅读 1,779评论 0 0
  • 2017.3.6 被着一份吸引,向往,信任,交托,你来了 我说,一份补偿,我要把所有美好带给你。 请家长们放心。。...
    心晴伽园阅读 237评论 0 0