如何读取启用了 KVM 的 QEMU VM 的寄存器?

How to read the registers of a QEMU VM with KVM enabled?

我试图在随机时间对 QEMU 虚拟机的 EIP 寄存器进行采样。 为此,我在 QEMU 中创建了一个线程来执行:

CPUState* cpu=/*code for choosing a random virtual cpu*/;
X86CPU *x86cpu = X86_CPU(cpu);
CPUX86State *env = &x86cpu->env;
while(true){
    waittime=(rand()%50000);
    usleep(waittime);
    eip = env->eip;
    printf("EIP= %zu\n",eip);
}

但是,它总是输出相同的值!

另一方面 - 如果我禁用 KVM - 它会完美地打印各种值......但我真的需要 KVM 工作......

如何使用 KVM 工作?

好的,我找到了答案,所以我在这里发布给其他人:

按照this discussion,我发现要读取寄存器值,必须将KVM 状态与QEMU 同步。因此,在读取寄存器之前,需要调用 kvm-all.c:kvm_cpu_synchronize_state()

没有它,您将只能读取陈旧的值。