2

我正在编写一个基于 Intel VT 的调试器。

由于 iret 指令在 vmx-guest 中的性能在 NMI-Exiting=1 时发生了变化。所以我应该自己在vmx-host中处理NMI,否则,guest会有nmi reentrant bugs。

我检查了英特尔手册:

在执行 NMI 中断处理程序时,处理器会禁用对 NMI 处理程序的额外调用,直到执行下一条 IRET 指令。这种对后续 NMI 的阻塞防止了对 NMI 处理程序的调用堆积。

所以我试图自己在 vmx-host 中模拟一个 iret。CPL 保持 ring0 并保持堆栈和代码段不变。

我在下面写了一个示例代码,它是在 NMI 导致的 vmx-exit 之后:

asm volatile(
    "pushfq \n\t"
    "mov %%cs.%%ax \n\t"
    "push  %%rax\n\t"
    "mov $._restart_code,%%rax \n\t"
    "push %%rax \n\t"
    "iret \n\t"/*manully iret in the host before vmx-entry.*/
    "._restart_code:"
    "nop":);

任何人都可以显示一些指南?

4

0 回答 0