正如http://wiki.osdev.org/Unreal_Mode所说,我有一些关于地址转换如何在大实模式下发生的问题
虚幻模式包括打破实模式段的“64Kb”限制,但仍通过调整描述符缓存来保持 16 位指令和段*16+偏移地址的形成
但我的问题是如何在过程中使用 gdt,甚至在转换为线性地址时是否使用它。如果有人可以指出切换到大实模式的某些规范或其他参考,那将非常有帮助,如果有人可以提供有关如何切换回实模式的一些见解,那将非常好。
问候,
阿尔卡
正如http://wiki.osdev.org/Unreal_Mode所说,我有一些关于地址转换如何在大实模式下发生的问题
虚幻模式包括打破实模式段的“64Kb”限制,但仍通过调整描述符缓存来保持 16 位指令和段*16+偏移地址的形成
但我的问题是如何在过程中使用 gdt,甚至在转换为线性地址时是否使用它。如果有人可以指出切换到大实模式的某些规范或其他参考,那将非常有帮助,如果有人可以提供有关如何切换回实模式的一些见解,那将非常好。
问候,
阿尔卡
是的,我很确定使用了 GDT,因为您需要先创建它。维基百科说:
要将 80386 或更高版本的微处理器置于虚幻模式,程序必须首先进入保护模式,在 GDT 或 LDT 中找到或创建平面描述符,使用相应的保护模式“选择器”加载一些数据段寄存器,然后切换回到真实模式。返回实模式后,处理器将继续使用在保护模式下建立的缓存描述符,从而允许从实模式访问 4 GiB 的“扩展”内存。
从 80386 开始,实模式程序可以使用带有操作数大小覆盖前缀的 32 位寄存器。这允许程序使用像 DS:[EAX] 这样的地址。在普通实模式下,如果 EAX 超过 0xFFFF,则会发生故障。在虚幻模式下,允许访问。
作为旁注,您提供的链接应该足以让您进入虚幻模式。从技术上讲,您不能“返回”到实模式,因为虚模式和实模式同时存在。它们之间唯一的主要区别可能是它们寻址内存的能力。如果您想“返回”到实模式,只需像通常在实模式中那样寻址内存即可。
基本上,您只需要记住这一点即可区分:
在普通实模式下,如果 EAX 超过 0xFFFF,则会发生故障。在虚幻模式下,允许访问。
我希望这有帮助!