Chinaunix首页 | 论坛 | 博客
  • 博客访问: 347993
  • 博文数量: 105
  • 博客积分: 2730
  • 博客等级: 少校
  • 技术积分: 1110
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-20 12:09
文章分类

全部博文(105)

文章存档

2013年(3)

2012年(2)

2011年(36)

2010年(34)

2009年(6)

2008年(20)

2007年(4)

分类: C/C++

2010-09-21 14:27:06

现在的qemu用TCG翻译target系统到host指令.

qemu的文档和支持太贫乏,没有找到可用的image去测试一下mips-system

只能用SI来读源代码了.

target-mips/Translates.c:decode_opc函数就是动态翻译的第一个步骤了.
decode opcode

Translate-all.c: cpu_gen_code  --->>> 
Translates.c: gen_intermediate_code  --->>>
gen_intermediate_code_internal  --->>> 
decode_opc


Translate-all.c里有一些buf, 统称code generation context,
gen_opc_buf[]
gen_opparam_buf[]
gen_opc_pc[]
gen_opc_instr_start[]
gen_opc_npc[]
gen_opc_jump_pc[2]
for mips or sh4:
gen_opc_hflags[]

cpu_gen_init()用来初始化生成上下文,全局变量TCGContext tcg_ctx
其指针s.
tb是translation block,


=1=首先tcg_func_start(s); 都是清理缓存/指针归零等初始化工作 reset.
=2=然后gen_intermediate_code (env, tb); 翻译为中间代码
=3=当前块完成后,再设置s的tb_next,使跳转可以直接在TB间跳.
=4=tcg_gen_code, 这里生成host代码.



TB的结构里有三个元素:
tb_next_offset 原target代码的跳转目标地址
#if use_direct_jmp
    tb_jmp_offset 跳转指令的地址
#else
    tb_next 翻译后的下一块的地址.
#endif


tcg_gen_code --->>> tcg_gen_code_common --->>> tcg_liveness_analysis, for(;;)

liveness是进行一些非必须的代码优化, 可以什么也不做. 然后是for循环,生成目标代码.


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