为什么实模式应用程序不能 运行 处于保护模式?

why real mode applications cannot be run in a protected mode?

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

谢谢

LDT 是可选的。 IDT 是实模式 IVT 的保护模式等价物,具有相同的目的。它描述了 ISR 和异常处理程序的入口点。您需要 IDT 才能为硬件和软件中断和异常提供服务。如果你可以没有这些,你就不需要设置 IDT。

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

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

理论上,您可以设置 GDT and/or LDT 描述符,而不是选择器 N 选择基地址为 N*16 的 64KB 段的描述符。在实践中这是一个kludge。然而,Borland 在他们的 Borland Pascal 7 中实现了这个方案,所以你可以用类似于你为实模式编写它们的方式来编写保护模式程序。