目前我正在研究x86指令集架构(ISA)的动态指令替换。到目前为止,我只为基于RISC-V的处理器体系结构做了这件事。由于没有可以合成到FPGA的公共域x86实现,我现在必须坚持可视化。
我的实验设置如下:来宾应用程序(使用gcc编译,没有外部库)以qemu用户模式运行。(我发现这篇文章确实很有帮助:QEMU-Code Flow[指令缓存和TCG])整个系统在Fedora 25 Linux操作系统上运行,并使用最新的git源代码构建。
一些指令(我自己的代码分析)在内部发送给
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)到目前为止,体系结构(虽然非常复杂)是直接的。
我感兴趣的是:
- 如何处理这些gen_lea_modrm方法捕获的指令
- 可以观察通过KVM天真地传递的指令吗
- 翻译缓冲区(tb)是分块的(据我所知),我可以扩展缓冲区以注入指令吗
- 是否有任何内置设施可以进行指令分析
我用我的搜索词搜索得很彻底。任何形式的提示、提示或建议都将非常有用和感激。
谨致问候。
TCG和KVM是QEMU完全独立的操作模式。如果您使用KVM(通过命令行上的-enable KVM),那么所有来宾指令要么由主机CPU本地执行,要么(对于少数主要对模拟设备执行I/O的指令)在主机内核内模拟;QEMU的TCG指令模拟(这就是您在上面提到的代码)根本没有使用过。相反,如果您在TCG模式(默认模式)下使用QEMU,那么我们在用户空间中是一个纯粹的模拟器,不使用主机CPU的系统管理程序功能。qemu用户模式始终是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。。。