【问题标题】:Get the supported "bitness" of an x86 CPU when booted in 16-bit mode在 16 位模式下启动时获得 x86 CPU 支持的“位数”
【发布时间】: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 位)。

标签: assembly x86 x86-16


【解决方案1】:

检查 32 位(请参阅 http://www.rcollins.org/ddj/Sep96/Sep96.html):

  • 在执行pushf 时,没有保护模式 (8088/8086/80186) 的 16 位 CPU 将始终设置标志寄存器的高 4 位 (15-12)
  • 80286 在pushf 上的高 4 位将始终被清除(在实模式下运行时)
  • 支持 32 位的 CPU 允许在实模式下使用 popf 修改高 4 位(但是所有 4 位应具有相同的值 - 全部设置或全部清除)

通过使用pushfpopf并修改堆栈上的数据,您检查是否可以修改高4位;如果是,则必须是 32 位 CPU。

检查CPUID

  • 确保 CPU 支持 32 位(见上文)
  • 切换到 32 位模式
  • 检查是否可以修改 EFLAGS 的第 21 位(设置和清除);如果该位的值不固定(可以从 0 更改为 1,反之亦然),则支持 cpuid 指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多