qemu内存操作

pra*_*kar 8 memory virtualization kvm qemu

我打算使用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
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 有人可以指向我错过的其他加载/存储点(直接或间接)吗?
  2. qemu是否提供单个入口点函数来访问guest虚拟机内存(如guest_read()),可以检测它来跟踪guest虚拟机内存中的所有负载???
  3. 有人可以指出一个好的文档,我可以理解qemu如何维护客户内存的状态?

对不起朋友提供上一封邮件中的误导性说明.

cmp ecx, [r12+0x4]
mov r10b, [r13+0x0]
mov byte [rax+0xf0000], 0x0
mov byte [rax+rdx], 0x0
Run Code Online (Sandbox Code Playgroud)

似乎所有上述说明都被tcg_gen_ld/st助手所覆盖.

但是现在我偶然发现了另一个问题:
我最初认为与guest虚拟机内存的所有交互都是通过translate.c文件中的helper指令进行的.然而,我发现,对于一些指令的辅助函数喜欢cmpxcgh8bcmpxchg16b实际访问客户机内存.

那么,这是否意味着有多个入口点用于读取访客内存.有人可以解释一下如何翻译ldq和stq指令来访问来宾内存?

Pao*_*ini 3

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

例如, grepcmpxchg8b给出

target/i386/mem_helper.c:void helper_cmpxchg8b(CPUX86State *env, target_ulong a0)
Run Code Online (Sandbox Code Playgroud)

在该函数内部:

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);
Run Code Online (Sandbox Code Playgroud)