X86 从指令替换的角度看QEMU和KVM的交互

X86 从指令替换的角度看QEMU和KVM的交互,x86,qemu,kvm,fedora-25,X86,Qemu,Kvm,Fedora 25,目前,我正在研究x86指令集体系结构(ISA)的动态指令替换。到目前为止,我只为基于RISC-V的处理器架构做了这项工作。 由于没有公共域x86实现可以合成为FPGA,所以我现在必须坚持使用可视化 我的实验设置如下: 来宾应用程序(使用gcc编译,没有外部库)以qemu用户模式运行。(我发现这篇文章确实很有帮助:)整个系统运行在Fedora25Linux操作系统上,并基于最新的git源代码构建 一些指令(我自己的代码分析)在内部发送到 static AddressParts gen_lea_mo

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

我的实验设置如下: 来宾应用程序(使用gcc编译,没有外部库)以qemu用户模式运行。(我发现这篇文章确实很有帮助:)整个系统运行在Fedora25Linux操作系统上,并基于最新的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事务:)该体系结构(尽管非常复杂)到目前为止是直截了当的

我对以下方面感兴趣:

  • 这些gen_lea_modrm方法捕获的指令是如何处理的
  • 是否可以观察通过KVM天真地传递的指令
  • 翻译缓冲区(tb)是分块的(据我所知),我可以扩展缓冲区来注入指令吗
  • 是否有任何内置工具来进行指令分析
  • 我用我的搜索词彻底搜索了一遍。任何类型的提示、提示或建议都会非常有帮助,我们将不胜感激


    致以最诚挚的问候。

    TCG和KVM是QEMU完全不同的操作模式。如果您正在使用KVM(通过命令行上的-enable KVM),那么所有来宾指令要么由主机CPU本机执行,要么(对于少数指令,主要是对模拟设备执行I/O)在主机内核内模拟;QEMU的TCG指令模拟(您在上面提到的代码)从未使用过。相反,如果您在TCG模式(默认模式)下使用QEMU,那么我们是用户空间中的纯仿真器,不使用主机CPU的hypervisor功能。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…

    首先非常感谢您的详细解释。实际上,我知道基于TCG和基于KVM的执行之间的区别是什么。但我不确定确切的线路在哪里。到目前为止。关于来宾二进制解释/执行。我假设(因为调用方是gen_nop_modrm(env,s,modrm))这类指令将与NOPs匹配。因此,最后,子程序将确保下一条指令(指向insn的指针等)的对齐是精确的。根据你的意见,我想,我必须深入研究监督执行之类的问题。