【发布时间】:2018-05-22 18:30:35
【问题描述】:
我正在开发一个 x86 引导加载程序并遇到了这个问题(我想这应该很简单,但到目前为止我还没有解决):我想检测 CPU 主机的位数(例如,如果它只有 16 位,或支持 32 位或 64 位)。
我使用了 CPUID 指令,但它是在 486 中引入的,因此对于检测仅 16 位与支持 32 位保护模式(或 32 位操作数大小)的 386 兼容 CPU 没有帮助在带前缀的实模式下)。
【问题讨论】:
-
只是出于好奇 - 您将启动什么,它支持所有 16、32 和 64 位处理器?
-
@davmac:在传统非 EFI 模式下引导的 BIOS 会加载引导扇区并在 16 位实模式下跳转到它。由该代码切换到受保护或长模式(在加载更多扇区或其他之后)。如果您想在不支持 32 位或 64 位模式的(虚拟)机器上打印一条漂亮的错误消息,您需要先检查一下。例如与wiki.osdev.org/…
-
我记得这个问题经常被问到。这必须是重复的。您可以通过检查 FLAGS 中的一些位来了解您的 CPU 是否为 386 或更高。
-
@AntónSeoane:检测对 64 位模式的支持在 OSdev wiki 上有详细介绍。 wiki.osdev.org/…。保护模式文章 (wiki.osdev.org/Protected_Mode) 没有显示检测方法。它有更多东西的链接。我不会发布答案;我会把它留给喜欢使用自定义内核的人之一。
-
这个page 具有检测前CPUID CPU 的代码。如果你有 CPUID 指令,你可以用它来检测 64 位模式(隐含 32 位)。