我发现很多网站和书籍都解释了 8086 和更高版本的 x86 CPU 在实模式下的内存管理是如何工作的。我想我理解了两个 16 位值、段地址和偏移量如何组合起来得到一个线性的 20 位物理地址(将段向左移动四位,添加偏移量;段为 64K,每 16 个字节开始一次)。
但是我找不到任何好的网站或书籍来解释保护模式下的内存管理如何工作,特别是 80286 和 80386 之间的区别。
谁能告诉我一个好的网站或书籍(或就在这里解释一下)?
(为了获得额外积分,即赞成,它在长模式下如何工作?)
答案1
http://www.ddj.com/184409207Dr Dobbs 在 93 和 94 年发表了几篇关于此问题的文章,286 和 386 处理内存的方式并没有太大区别。基本情况是,您无法对段:偏移寄存器进行操作,因为基本内存位置和长度现在是选择器的一部分,您可以像引用句柄一样引用它。
您设置选择器 N,其基地址为 X,长度为 M。当激活该选择器时(还记得 CS:汇编语法吗?),将使用该范围的内存(分页等)。选择器 N(16 位句柄)引用该数据结构。
平面内存模型保护模式将代码、数据和堆栈设置为相同的内存地址(长度为 4gb)。该链接很好地涵盖了基础知识。
答案2
对于实模式,没有内存管理,它只是将段寄存器乘以 16,然后添加偏移量,然后将 21 位结果(是的,是 21 位,因为 0xFFFF*0x10+0xFFFF=0xFFFF0*0xFFFF=0x1FFFEF 或 1_1111_1111_1111_1110_1111b,一个 21 位值)放在地址总线上。
对于长模式,虽然存在分段,但是描述符的基数为 0,限制为 0xFFFFFFFFFFFFFFFF(16EB),因此是平面模式,分页围绕,类似于 PAE 分页,但是页目录指针表从 4 个条目扩展到 512 个条目,并且页级 4 表有 512 个条目,每个条目指向不同的页目录指针表。
这里有一些对此进行更详细解释的网站: http://en.wikipedia.org/wiki/Real_mode对于实模式和 http://en.wikipedia.org/wiki/Long_mode模式