32 位或 64 位 CPU 在 Linux 上是否使用分段寻址?

32 位或 64 位 CPU 在 Linux 上是否使用分段寻址?

32 位或 64 位 CPU 在 Linux 上使用分段寻址吗?我知道在较旧的 CPU(如 8086)上使用分段进行内存寻址,但不确定 Linux 操作系统是否在 32 位或 64 位 CPU 上使用这种方法。

答案1

最初(286 之前)分段主要是为在 16 位 CPU 上寻址超过 64KB 而设的一项改进。在 286 保护模式下,分段得到扩展以引入保护,并将支持的物理内存从 1MB 扩展到 16MB。但 CPU 仍然只有 16 位寄存器,这意味着任何大于 64KB 的连续数据块都难以处理。

随着 386 的推出,这一切都发生了变化。CPU 寄存器扩展到 32 位,并添加了分页这一新功能。分页是一种比分段更强大的逻辑地址和物理地址映射方法。

Linux 最初是为 386 设计的,并使用了分页功能。Linux 对分段的使用很少,一些保护设置是通过段描述符来控制的,这意味着您无法完全避免分段的需要。但 Linux 会将所有段配置为从地址 0 开始。

换句话说:Linux 从未使用过分段寻址。它使用分段只是因为控制某些保护功能需要分段。

当 AMD 设计 64 位 CPU 时,他们决定在 64 位模式下不支持一些历史特性。他们所做的一件事就是强制将段起始地址设为 0。因此,从那时开始,硬件和软件都不再支持分段地址。

如果您在 16 位或 32 位模式下运行现代 CPU,它仍支持分段地址以实现向后兼容。但在 64 位模式下,您只有 64 位线性地址和分页。

答案2

8086 实际上并没有与现代 x86 CPU 相当的 MMU;在 386 及更高版本中,情况截然不同:

  • 任意多个虚拟内存区域
  • 页表来映射这些
  • 嵌套页表只是为了让事情更容易工作
  • 进一步的虚拟化形式

这是一个相当复杂的话题,我认为超级用户无法给出对 x86 内存管理架构的简明概述。但是,分段并不是用来描述该架构的术语之一。恐怕我只能请您阅读一篇关于 386 和 x86 操作系统设计的文章。

相关内容