现在的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循环,生成目标代码.
阅读(1910) | 评论(0) | 转发(0) |