我最近正在为英特尔 CPU 编写一个微型管理程序。我的微管理程序在启用 VMX 时运行。但是,我在尝试重启机器时遇到了问题。
我决定按照 https://wiki.osdev.org/Reboot 执行 PS/2 8042 重置(即写入命令 0xfe 到 IO 端口 0x64)。但是,我发现启用VMX后,8042重置不成功(我必须使用电源按钮重新启动机器)。但是,如果我使用 VMXOFF 禁用 VMX,然后执行 8042 重置,则重置成功(然后我看到 BIOS 闪屏等)
我的问题是:为什么我不能在启用 VMX 的情况下执行 8042 重置?OSDev 说 8042 控制器将脉冲重置线。我假设这意味着断言 RESET# 引脚。 Intel的SDM并没有说VMX会导致RESET#被忽略。
此外,在谷歌搜索时,我在Linux的重启代码中看到了这个评论:
禁用虚拟化,即 VMX 或 SVM,以确保在期间识别 INIT 重启。如果 CPU 是后 VMXON,则 VMX 阻塞 INIT,如果 GIF=0,即如果崩溃发生在 CLGI 和 STGI 之间。
Intel 的 SDM 确实说当启用 VMX 时,INIT 中断被阻止。 INIT 中断与 8042 复位有关吗?或者 Linux 是否使用 8042 reset 以外的方法重新启动?一般情况下,硬件是如何复位CPU的?