QEMU 进出code cache流程 (qemu-1.3.0,i386为例)

本文详细介绍了QEMU VCPU如何进入和退出code cache,重点解析了从$QEMUDIR/cpu-exec.c的cpu_exec()函数开始,通过tcg_qemu_tb_exec函数进入代码缓存的过程,以及code_gen_prologue在code cache中的作用,包括寄存器保存、跳转指令生成等关键步骤。
摘要由CSDN通过智能技术生成

首先要知道的是,VCPU从哪里进入code cache:

在$QEMUDIR/cpu-exec.c的函数cpu_exec(),这个函数是VCPU模拟CPU功能的主函数,包括异常,中断等的处理、binary translate、TB(translate block)管理查找以及真正CPU指令的执行。在跳过一大段中断异常的处理后,在代码599行(qemu-1.3.0):

                    next_tb = tcg_qemu_tb_exec(env, tc_ptr);

这行代码表示当前VCPU线程真正进入code cache。


在查找tcg_qemu_tb_exec这个函数定义的时候会发现整个qemu代码中有三处定义:

1.$QEMUDIR/tcg/ppc/tcg-target.h中,从它的目录中看出他并不是我们要找的。

2.$QEMUDIR/tci.c,这里对tcg_qemu_tb_exec这个函数有完整的定义,但是它并不是这里我要讨论。tci.c中的这个函数是在interpret模式下使用的,在默认config下我们可以删除这个tci.c进行编译,完全不影响。而我现在要讨论的是在binary translate方式时使用的这个tcg_qemu_tb_exec。

3.$QEMUDIR/tcg/tcg.h中定义。没错,这个才是我们要找的:

#if !defined(tcg_qemu_tb_exec)
# define tcg_qemu_tb_exec(env, tb_ptr) \
    ((tcg_target_ulong (*)(void *, void *))code_gen_prologue)(env, tb_ptr)
#endif

但是这个macro只定义

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值