目前我正在研究x86指令集架构(ISA)的动态指令替换。到目前为止,我只为基于RISC-V的处理器架构做到了这一点。 由于没有可用于FPGA的公共域x86实现,我现在必须坚持可视化。
我的实验设置如下: guest虚拟机应用程序(使用gcc编译,无外部库)在qemu-user-mode中运行。 (我发现这篇文章确实非常有用:QEMU - Code Flow [ Instruction cache and TCG])整个系统在Fedora 25 Linux操作系统上运行,并使用最新的git-sources构建。
一些指令是(我自己的代码分析)内部调度到
static AddressParts gen_lea_modrm_0(CPUX86State *env, DisasContext *s, int modrm)
从那里,我不能告诉这类指令发生了什么。
gen_nop_modrm(env, s, modrm); (translate.c:8108)
是调用方法。
我的主要目标是在识别指令后添加指令,以便延迟连续执行同一指令。
我读到了基于KVM的QEMU执行是如何工作的。显然,某种超视觉是可能的(即使对于USB交易:https://www.blackhat.com/docs/eu-14/materials/eu-14-Schumilo-Dont-Trust-Your-USB-How-To-Find-Bugs-In-USB-Device-Drivers-wp.pdf)这种架构(虽然非常复杂)是迄今为止直截了当的。
我感兴趣的是:
我用搜索词彻底搜索了。任何提示,提示或建议都会非常有用和赞赏。
最诚挚的问候。
答案 0 :(得分:1)
TCG和KVM是QEMU完全独立的操作模式。如果您正在使用KVM(通过命令行上的-enable-kvm),那么所有访客指令要么由主机CPU本机执行,要么(主要是对模拟设备进行I / O操作的一些指令)在主机内核中进行仿真; QEMU的TCG指令仿真(这是你上面提到的代码)根本就没用过。相反,如果您在TCG模式下使用QEMU(默认值),那么我们在用户空间中是纯模拟器,并且不使用主机CPU的管理程序功能。 qemu-user-mode始终是TCG仿真,而不是KVM。
要回答有关TCG代码的问题,gen_lea_modrm_0()并未完全处理特定类别的指令。它只是处理该形式的指令的解码部分 - 它查看指令的modrm字节,从指令流加载一些其他字节,并返回一个结构,指示指令正在使用的寻址模式的细节。 。它还确保PC已经在整个指令上先进,包括即时数据。调用gen_lea_modrm_0()的代码然后使用寻址模式信息作为发送TCG IR操作的一部分来完成工作。 gen_nop_modrm()是一种特殊情况,因为它被调用的指令是一种或另一种形式的NOP。所以没有“真正的工作”要做,而对gen_lea_modrm_0()的调用唯一能达到的目的是确保我们已经将PC推进到insn编码的任何中间数据之上。我们不发出TCG IR操作,然后当生成的代码运行时,没有任何反应,这正是你想要的NOP ......