x86 在实模式下检查保护模式和长模式

0 x86 assembly real-mode

所以我想检查在实模式下是否支持保护模式和长模式。我知道我可以在处于保护模式时检查对长模式的支持,但这需要cpuid我认为我们在实模式下没有的指令(至少在旧处理器中)。

我没有找到任何相关信息。

Bre*_*dan 6

完整的序列可能是:

1.1) 通过测试flags寄存器的第15位是否被设置来确定CPU是否是真正的8086芯片。如果不这样做,下一步可能会导致 CPU 崩溃。

1.2) 通过测试IOPL标志(FLAGS寄存器的第12位和第13位)是否可以修改来确定CPU是否支持32位。如果不这样做,下一步可能会导致 CPU 崩溃

1.3) 检查ID标志(eflags寄存器的第21位)是否可以修改。如果可以修改,则CPU支持CPUID指令。请注意,如果 CPU 支持 32 位指令,则可以在实模式下使用 32 位指令(以推送和弹出标志)。

注1:凭记忆;有一些CPU(来自National Semiconductor的NexGen)支持CPUID,但不支持Intel的“ID flag”方法;并且有一些 CPU(来自 Cyrix 和 IBM)需要启用 CPUID 指令才能使用(通过特殊 IO 端口)。处理这些 CPU 是可能的,但超出了我的回答范围。

注2:作为替代方案;如果您知道它不是 8086,则可以安装无效操作码异常处理程序并尝试执行 CPUID 指令。如果调用无效操作码异常处理程序,则当前不支持 CPUID。

2.1) 使用“CPUID with EAX=0x80000000”判断CPUID是否支持“CPUID with EAX=0x80000001”。此步骤只是一个健全性检查,以防 CPU 从不支持的 CPUID 函数返回未知信息(例如,来自支持的最高 CPUID 函数)。

2.2) 使用“CPUID with EAX=0x80000001”来获取(AMD 的)扩展功能标志。测试 EDX 中的位 29 以确定是否支持长模式。

注 3:对于 UEFI 引导加载程序,您始终可以假设支持 CPUID(例如,对于 32 位 UEFI)。对于 64 位 UEFI,您可以跳过所有这些(您已经在使用长模式,因此必须支持它)。