为什么实模式应用程序无法在保护模式下运行?

时间:2016-08-01 04:49:41

标签: x86 operating-system kernel protected-mode gdt

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

由于

1 个答案:

答案 0 :(得分:2)

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

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

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

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

相关问题