assembly x86在真实的模式下检查受保护模式和长模式

h7wcgrx3  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(134)

因此,我想检查在真实的模式下是否支持保护模式和长模式。我知道在保护模式下可以检查长模式的支持,但这需要cpuid指令,我认为实模式下没有(至少在旧处理器中没有)。
我没有找到任何相关信息。

vatpfxk5

vatpfxk51#

完整序列可能是:
1.1)通过测试标志寄存器的第15位是否置位来确定CPU是否是一个真正的8086芯片。如果不这样做,下一步可能会导致CPU崩溃。
1.2)通过测试IOPL标志(FLAGS寄存器的12位和13位)是否可以修改来确定CPU是否支持32位。如果不这样做,下一步可能会导致CPU崩溃
1.3)检查ID标志(eflags寄存器的第21位)是否可以修改。如果可以修改,则CPU支持CPUID指令。请注意,如果CPU支持32位指令,则可以在真实的模式下使用32位指令(推送和弹出eflags)。
注1:根据记忆;有一些CPU(来自国家半导体的NexGen)支持CPUID,但不支持Intel的“ID标记”方法;还有一些CPU(Cyrix和IBM)需要启用CPUID指令才能使用(通过特殊的IO端口)。处理这些CPU是可能的,但超出了我的回答范围。
注2:作为备选;如果您知道它不是8086,您可以安装一个无效操作码异常处理程序,并尝试执行CPUID指令。如果您的无效操作码异常处理程序被调用,则CPUID当前不受支持。
2.1)使用“CPUID with EAX= 0x 80000000”来确定CPUID是否支持“CPUID with EAX= 0x 80000001”。此步骤只是一个健全性检查,以防CPU从不受支持的CPUID函数返回未知信息(例如,从支持的最高CPUID函数返回)。
2.2)使用“CPUID with EAX= 0x 80000001”获取(AMD的)扩展功能标志。测试EDX中的位29以确定是否支持长模式。
注3:对于UEFI Boot 加载程序,您可以始终假设CPUID受支持(例如,对于32位UEFI)。对于64位UEFI,您可以跳过所有CPUID(您已经在使用长模式,因此必须支持它)。

相关问题