之前读了一些QEMU的源码,跟踪了一下QEMU的执行流程,记录下来了,现在将流程记录如下:
main()[vl.c] --> cpu_signal()[cpus.c] --> cpu_exit()[exec.c] -->tb_reset_jump() --> tb_se_jmp_target()[exec-all.h]
-->tb_reset_jump_recursive()[exec.c] -->cpu_exec()[cpu-exec.c] --> qemu_tcg_cpu_thread_fn()[cpus.c] --> cpu_exec()[cpu-exec.c]
-->tb_find_fast() --> tb_gen_code()[exec.c] --> cpu_gen_code()[translate-all.c] --> tcg_gen_code()[tcg/tcg.c] -->
tcg_gen_code_common()[tcg/tcg.c] --> tcg_reg_alloc_op()[tcg/tcg.c] --> all_cpu_threads_idle()[cpus.c] --> qemu_tcg_wait_io_event()[cpus.c]
--> qemu_cond_wait()[qemu_thread_posix.c]
user mode 和 system mode 不同的是
user mode在执行到cputlb.c的 get_page_addr_code() 的时候直接return addr, 没有访存模拟。
system mode 在执行到cputlb.c的get_page_addr_code()的时候,需要进一步模拟访存,然后转到host访存,之后才执行。