我打算使用 Qemu 为执行 x86 客户操作系统生成内存跟踪。
根据 tcg wiki 页面,Qemu 使用一些帮助程序来生成目标(来宾)内存的加载/存储。这个指令列表是tcg_gen_qemu_ld8s/u
, tcg_gen_qemu_ld16s/u
, tcg_gen_qemu_ld32s/u
, tcg_gen_qemu_ld64
。(我们有一套类似的商店说明)。我在target-i386/translate.c文件中捕获对上述函数的所有调用
但是,我仍然缺少某些指令的加载/存储,例如
cmp ecx, [r12+0x4]
mov r10b, [r13+0x0]
mov byte [rax+0xf0000], 0x0
mov byte [rax+rdx], 0x0
问题 :
- 有人可以指出我缺少的其他加载/存储点(直接或间接)吗?
- qemu 是否为访问来宾内存(如
guest_read()
)提供了单一入口点功能,可用于跟踪来自来宾内存的所有负载? - 有人可以指出一个好的文档,我可以在其中了解 qemu 如何维护客户内存的状态?
抱歉朋友们在之前的邮件中的误导性说明。
cmp ecx, [r12+0x4]
mov r10b, [r13+0x0]
mov byte [rax+0xf0000], 0x0
mov byte [rax+rdx], 0x0
似乎所有上述说明都被tcg_gen_ld/st
助手覆盖了。
但是现在我偶然发现了另一个问题:
我最初认为与客户内存的所有交互都是通过 translate.c 文件中的帮助指令发生的。但是,我发现一些指令的帮助程序功能,例如cmpxcgh8b
并且cmpxchg16b
实际上正在访问客户内存。
那么,这是否意味着读取客户记忆的入口点不止一个。有人可以解释一下 ldq 和 stq 指令是如何翻译来访问客户内存的吗?