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