我正在研究这种真实到保护模式的转换。我怀疑是否可以在不加载 ldt 和 idt 而是通过加载 gdt 的情况下实现真正的保护模式。一方面,第二个疑问出现了,为什么实模式程序不能在保护模式下运行而不转换到 v8086 模式?
谢谢
我正在研究这种真实到保护模式的转换。我怀疑是否可以在不加载 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 中实现了这个方案,因此您可以以类似于为实模式编写保护模式程序的方式编写保护模式程序。