Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory qemu内存操作_Memory_Virtualization_Qemu_Kvm - Fatal编程技术网

Memory qemu内存操作

Memory qemu内存操作,memory,virtualization,qemu,kvm,Memory,Virtualization,Qemu,Kvm,我打算使用Qemu为x86客户操作系统的执行生成内存跟踪 根据tcg wiki页面,Qemu使用少数助手生成目标(来宾)内存的加载/存储。 此指令列表为tcg\u gen\u qemu ld8s/u,tcg\u gen\u qemu ld16s/u,tcg\u gen\u qemu ld32s/u,tcg\u gen\u qemu ld64。(我们有一套类似的存储说明)。 我在target-i386/translate.c文件中捕获对上述函数的所有调用 但是,我仍然缺少某些指令的加载/存储,如

我打算使用Qemu为x86客户操作系统的执行生成内存跟踪

根据tcg wiki页面,Qemu使用少数助手生成目标(来宾)内存的加载/存储。 此指令列表为
tcg\u gen\u qemu ld8s/u
tcg\u gen\u qemu ld16s/u
tcg\u gen\u qemu ld32s/u
tcg\u gen\u 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\u read()
    )提供了一个单一的入口点函数,该函数可用于跟踪来宾内存中的所有负载
  • 有人能指出一个好的文档,我可以理解qemu如何维护来宾内存的状态吗
  • 抱歉,朋友们在上一封邮件中给出了误导性的说明

    cmp ecx, [r12+0x4]
    mov r10b, [r13+0x0]
    mov byte [rax+0xf0000], 0x0
    mov byte [rax+rdx], 0x0
    
    tcg\u gen\u ld/st
    帮助程序似乎涵盖了上述所有说明

    但现在我偶然发现了另一个问题:
    我最初认为所有与来宾内存的交互都是通过translate.c文件中的helper指令进行的。 但是,我发现一些指令的助手函数,如
    cmpxcgh8b
    cmpxchg16b
    实际上正在访问来宾内存

    那么,这是否意味着读取来宾内存的入口点不止一个呢。
    有人能解释一下如何翻译ldq和stq指令来访问来宾内存吗

    加载数据的其他函数称为
    cpu\u ld*\u data
    cpu\u st*\u data
    ,或
    cpu\u ld*\u data\u ra
    cpu\u st*\u data\u ra
    \u ra
    版本有一个附加参数,它是生成代码中调用方的地址。它用于在加载或存储生成页面错误时计算错误指令的地址

    例如,对
    cmpxchg8b
    进行grepping可以得到

    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);