X86 为什么实模式应用程序不能在保护模式下运行?

X86 为什么实模式应用程序不能在保护模式下运行?,x86,operating-system,kernel,protected-mode,gdt,X86,Operating System,Kernel,Protected Mode,Gdt,我在研究这种从实模式到保护模式的转换。我怀疑在不加载ldt和idt而加载gdt的情况下,是否可以实现真正的受保护模式。有了这一点,第二个疑问出现了,为什么真正的模式程序不能在保护模式下运行而不切换到v8086模式 谢谢LDT是可选的。IDT是实模式IVT的等效保护模式,具有相同的用途。它描述了ISR和异常处理程序的入口点。您需要一个IDT来为硬件和软件中断和异常提供服务。如果你可以没有这些,你就不需要建立IDT 切换到保护模式需要的不仅仅是设置GDT和执行LGDT。您需要将CR0位0更改为1,执

我在研究这种从实模式到保护模式的转换。我怀疑在不加载ldt和idt而加载gdt的情况下,是否可以实现真正的受保护模式。有了这一点,第二个疑问出现了,为什么真正的模式程序不能在保护模式下运行而不切换到v8086模式


谢谢

LDT是可选的。IDT是实模式IVT的等效保护模式,具有相同的用途。它描述了ISR和异常处理程序的入口点。您需要一个IDT来为硬件和软件中断和异常提供服务。如果你可以没有这些,你就不需要建立IDT

切换到保护模式需要的不仅仅是设置GDT和执行LGDT。您需要将CR0位0更改为1,执行跳转,加载段寄存器(最好全部加载,以避免在各种上下文切换期间出现未初始化段寄存器的问题),选择器指向适当的GDT条目

实模式代码通常不能在保护模式下运行(除了虚拟8086(子)模式),因为段寄存器中的实模式值不能在保护模式下工作,并且因为段:偏移地址在保护模式下转换为物理地址的方式不同(在GDT上读取和页转换)。IOW,向段寄存器中的值添加1不再具有向结果物理地址添加16的效果。此外,您不能同时拥有可读、可写和可执行的段


从理论上讲,您可以这样设置GDT和/或LDT描述符,即选择器N为基址为N*16的64KB段选择描述符。实际上,这是一个难题。然而,Borland在他们的Borland Pascal 7中实现了这个方案,因此您可以以类似于为真实模式编写保护模式程序的方式编写保护模式程序。

LDT是可选的。IDT是实模式IVT的等效保护模式,具有相同的用途。它描述了ISR和异常处理程序的入口点。您需要一个IDT来为硬件和软件中断和异常提供服务。如果你可以没有这些,你就不需要建立IDT

切换到保护模式需要的不仅仅是设置GDT和执行LGDT。您需要将CR0位0更改为1,执行跳转,加载段寄存器(最好全部加载,以避免在各种上下文切换期间出现未初始化段寄存器的问题),选择器指向适当的GDT条目

实模式代码通常不能在保护模式下运行(除了虚拟8086(子)模式),因为段寄存器中的实模式值不能在保护模式下工作,并且因为段:偏移地址在保护模式下转换为物理地址的方式不同(在GDT上读取和页转换)。IOW,向段寄存器中的值添加1不再具有向结果物理地址添加16的效果。此外,您不能同时拥有可读、可写和可执行的段


从理论上讲,您可以这样设置GDT和/或LDT描述符,即选择器N为基址为N*16的64KB段选择描述符。实际上,这是一个难题。然而,Borland在其Borland Pascal 7中实现了此方案,因此您可以以类似于真实模式的方式编写受保护模式程序。

请详细说明以下部分:受保护模式下的偏移量转换?@PantherCoder必读:英特尔®64和IA-32体系结构软件开发人员手册,第3卷“系统编程指南”,第2-5章及相关章节。是的,通常他们会在16位保护模式下使用处理器。一些早期的操作系统和环境会让内存访问发生故障,故障处理程序会生成一组描述符条目,以允许指令正确完成,然后在导致故障的指令处重新启动。通常,您会发现使用LOADALL指令直接加载隐藏的描述符条目。当然,这有很多陷阱——如果您希望操作系统和程序同时运行,则很难让操作系统和受保护模式程序一起运行,因为它们的一些描述符可能会重叠。这也是假设(在历史上的那个时候)当出现GPF lol时,您使用的286没有出现导致CX寄存器崩溃的错误。请详细说明以下内容:保护模式下的偏移量转换?@PantherCoder强制阅读:英特尔64和IA-32体系结构软件开发人员手册,第3卷“系统编程指南”,第2-5章及相关章节。是的,通常他们会在16位保护模式下使用处理器。一些早期的操作系统和环境会让内存访问发生故障,故障处理程序会生成一组描述符条目,以允许指令正确完成,然后在导致故障的指令处重新启动。通常,您会发现使用LOADALL指令直接加载隐藏的描述符条目。当然,这有很多陷阱——如果您希望操作系统和程序同时运行,那么当它们的一些描述符可能重叠时,很难让操作系统和受保护模式程序一起运行。这也是假设(在历史上的那个时候)您使用的286没有在出现GPF lol时阻塞CX寄存器的错误。