Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Assembly 如何在QEMU虚拟机上修改x86汇编指令的实现_Assembly_X86_Qemu_Rdtsc - Fatal编程技术网

Assembly 如何在QEMU虚拟机上修改x86汇编指令的实现

Assembly 如何在QEMU虚拟机上修改x86汇编指令的实现,assembly,x86,qemu,rdtsc,Assembly,X86,Qemu,Rdtsc,我想修改rdtsc汇编指令的实现,也就是说,我想在基本级别修改调用rdtsc汇编指令时会发生什么 我正在一台运行在英特尔Core2 Duo处理器上的QEMU虚拟机上工作。指令集架构是i686 为了找到处理rdtsc调用的QEMU源代码部分,我对整个源代码执行了grep,并在文件target-i386/misc\u helper.c中找到了函数helper\u rdtsc(),认为该函数是关键嫌疑犯。因此,我在该文件中进行了以下修改: . . /* modification start at h

我想修改
rdtsc
汇编指令的实现,也就是说,我想在基本级别修改调用
rdtsc
汇编指令时会发生什么

我正在一台运行在英特尔Core2 Duo处理器上的QEMU虚拟机上工作。指令集架构是
i686

为了找到处理rdtsc调用的QEMU源代码部分,我对整个源代码执行了grep,并在文件target-i386/misc\u helper.c中找到了函数helper\u rdtsc(),认为该函数是关键嫌疑犯。因此,我在该文件中进行了以下修改:

.
.

/* modification start at header inclusion */
#include <stdio.h>
#include <inttypes.h>
static const uint64_t myconst = 81926483;
/* modification end at header inclusion */
.
.

void helper_rdtsc(CPUX86State *env)
{
    uint64_t val;

    if ((env->cr[4] & CR4_TSD_MASK) && ((env->hflags & HF_CPL_MASK) != 0)) {
        raise_exception(env, EXCP0D_GPF);
    }
    cpu_svm_check_intercept_param(env, SVM_EXIT_RDTSC, 0);

    val = cpu_get_tsc(env) + env->tsc_offset;

    /* modification start within helper_rdtsc() */
    val = val % myconst;
    printf("rdtsc return = %" PRIu64 "//printed from source code\n", val);
    /* modification end within helper_rdtsc() */

    env->regs[R_EAX] = (uint32_t)(val);
    env->regs[R_EDX] = (uint32_t)(val >> 32);
}
当然,在执行此测试代码时,我希望通过
tick
返回的值小于
myconst
。我还希望从源代码打印的语句
rdtsc return=//作为
rdtsc
调用的一部分打印出来。然而,这一切都没有发生


我是否正在修改QEMU源代码的正确部分?如果是,我所做的修改是否有错误?如果没有,我应该在源代码中查找哪里来进行所需的修改?

事实上,我找到了另一个更可疑的地方:target-i386/translate.c。在我在那里添加printf并重新编译和安装它之后。我没有得到任何想要的东西。因此,我想您必须完成VMM级别的工作,这表示KVM源代码。

您是指qemu实现该指令的方式,还是它在主机硬件上执行的方式?后者包括申请英特尔的一份工作,并说服管理层改变著名命令的含义是一个好主意。前者涉及挖掘QEMU资源;它是开源的。@sevaalekseyev我是说前一个。我尝试过挖掘QEMU源代码,甚至尝试过几次修改,但都没有成功。因此,我希望有人能指出我应该在源代码中查找的确切位置。谢谢。你试过搜索“rdtsc”的代码吗?快速grep似乎表示target-i386/misc_helper.c中的helperrdtsc可能是候选对象。您是否尝试在其中搜索字符串“rdtsc?”:)@硬编码:你知道,这种工作可能值得在你的帖子中分享。我不认为您正在使用KVM版本或任何东西?
int64_t myrdtsc(void)
{
    int64_t tick;
    asm volatile("rdtsc" : "=A" (tick));
    return tick;
}