如何读取启用了 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()
。
没有它,您将只能读取陈旧的值。
我试图在随机时间对 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()
。
没有它,您将只能读取陈旧的值。