因此,我想检查在真实的模式下是否支持保护模式和长模式。我知道在保护模式下可以检查长模式的支持,但这需要cpuid指令,我认为实模式下没有(至少在旧处理器中没有)。我没有找到任何相关信息。
cpuid
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(您已经在使用长模式,因此必须支持它)。
1条答案
按热度按时间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(您已经在使用长模式,因此必须支持它)。