我正在研究这种从真实模式到受保护模式的转换。我怀疑在不加载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中实现了这个方案,所以你可以用类似于真实模式的方式编写保护模式程序。