3

目前我正在研究 x86 指令集架构 (ISA) 的动态指令替换。到目前为止,我只为基于 RISC-V 的处理器架构这样做。由于没有可以合成到 FPGA 的公共领域 x86 实现,我现在必须坚持使用可视化。

我的实验设置如下:一个来宾应用程序(用 gcc 编译,没有外部库)在 qemu-user-mode 下运行。(我发现这篇文章确实很有帮助:QEMU - 代码流 [指令缓存和 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)架构(虽然非常复杂)到目前为止是直截了当的。

我对感兴趣:

  1. 这些 gen_lea_modrm 方法如何处理指令。
  2. 可以观察到通过 KVM 天真地传递的指令吗?
  3. 翻译缓冲区(tb)被分块(据我所知),我可以扩展缓冲区以注入指令吗?
  4. 是否有任何内置设施来进行指令分析

我用我拥有的搜索词彻底搜索了。任何类型的提示、提示或建议都会非常有帮助和赞赏。

此致。

4

1 回答 1

2

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...

于 2017-02-03T18:38:17.443 回答