8

我打算使用 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

问题 :

  1. 有人可以指出我缺少的其他加载/存储点(直接或间接)吗?
  2. qemu 是否为访问来宾内存(如guest_read())提供了单一入口点功能,可用于跟踪来自来宾内存的所有负载?
  3. 有人可以指出一个好的文档,我可以在其中了解 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 指令是如何翻译来访问客户内存的吗?

4

1 回答 1

3

加载数据的其他函数称为cpu_ld*_dataand cpu_st*_data, or cpu_ld*_data_raand cpu_st*_data_ra。该_ra版本有一个附加参数,即生成代码中调用者的地址。它用于计算错误指令的地址,以防加载或存储产生页面错误。

例如,grepping forcmpxchg8b给出

target/i386/mem_helper.c:void helper_cmpxchg8b(CPUX86State *env, target_ulong a0)

在那个函数里面:

uintptr_t ra = GETPC();
...
oldv = cpu_ldq_data_ra(env, a0, ra);
newv = (cmpv == oldv ? newv : oldv);
/* always do the store */
cpu_stq_data_ra(env, a0, newv, ra);
于 2017-04-11T18:49:02.707 回答