"hlt"-指令 ignored/skipped 在我的 x86_64 引导代码中(当我在 QEMU 中测试它时)
"hlt"-instruction ignored/skipped in my x86_64 boot code (when I test it in QEMU)
我正在编写一个在启动过程的早期阶段运行的二进制文件。具体来说,是一个兼容 multiboot2 的内核,在 GRUB 切换后以 64 位 (AMD64/x86_64) 模式运行(GRUB 是我的引导加载程序)。为了调试和测试我的代码,我想到了将值写入寄存器并执行 hlt
。之后,我可以在 QEMU 中查看寄存器值。令人惊讶的是,我的 hlt
指令是 ignored/skipped 并且 eax
中的寄存器值不是我期望的那样。我不明白为什么,因为当我使用指示 GRUB 执行 32 位 multiboot2 切换的 multiboot2-header 时,它起作用了。这是怎么回事?
在我的项目中我发现,当 GRUB 在 EFI amd64 机器中切换二进制文件并启用引导服务时-state [section 3.5 of Multiboot2 spec],中断已启用。我不知道在这种情况下 QEMU 向 CPU 报告的具体中断是什么,但是如果您通过在 hlt
之前添加一次 cli
指令来禁用它们,它会按预期工作。不要忘记在内核中适当的时候再次启用中断。
我正在编写一个在启动过程的早期阶段运行的二进制文件。具体来说,是一个兼容 multiboot2 的内核,在 GRUB 切换后以 64 位 (AMD64/x86_64) 模式运行(GRUB 是我的引导加载程序)。为了调试和测试我的代码,我想到了将值写入寄存器并执行 hlt
。之后,我可以在 QEMU 中查看寄存器值。令人惊讶的是,我的 hlt
指令是 ignored/skipped 并且 eax
中的寄存器值不是我期望的那样。我不明白为什么,因为当我使用指示 GRUB 执行 32 位 multiboot2 切换的 multiboot2-header 时,它起作用了。这是怎么回事?
在我的项目中我发现,当 GRUB 在 EFI amd64 机器中切换二进制文件并启用引导服务时-state [section 3.5 of Multiboot2 spec],中断已启用。我不知道在这种情况下 QEMU 向 CPU 报告的具体中断是什么,但是如果您通过在 hlt
之前添加一次 cli
指令来禁用它们,它会按预期工作。不要忘记在内核中适当的时候再次启用中断。