【问题标题】:Linux Page Table Management and MMULinux页表管理和MMU
【发布时间】:2014-11-18 21:57:29
【问题描述】:

我有一个关于 linux 内核和 MMU 之间关系的问题。 我现在明白了 linux 内核管理虚拟内存地址和物理内存地址之间的页表。 同时x86架构中还有MMU,管理虚拟内存地址和物理内存地址之间的页表。 如果 MMU 出现在 CPU 附近,内核还需要处理页表吗?

这个问题可能很傻,但另一个问题是,如果MMU负责内存空间,谁来管理高内存和低内存?我相信内核将从 MMU 接收到虚拟内存的大小(32 位为 4GB),然后内核将在虚拟地址中区分用户空间和内核空间。 我对么?还是完全错误?

提前非常感谢!

【问题讨论】:

  • Linux 可能在没有 MMU 的硬件上运行,所以内核必须知道如何进行翻译,但在 x86 上,我相信它只是使用 MMU。
  • 我赞同 Gennadi 的评论。在 x86 架构上,MMU 负责将虚拟地址转换为物理地址,但内核仍会跟踪哪些页面属于内核以及哪些页面属于用户进程。我相信this 可能有助于阐明事情的运作方式。

标签: linux kernel computer-architecture mmu


【解决方案1】:

OS 和 MMU 页面管理职责是同一机制的两个方面,位于架构和微架构之间的边界。

第一面定义了硬件和在其上运行的软件(在本例中为操作系统)之间的“契约”——如果你想使用虚拟内存,你需要构建和维护一个页表,如合同。 另一方面,MMU 端是一个硬件单元,负责执行地址转换的硬件任务。这可能包括也可能不包括硬件优化,这些通常是隐藏的,并且可以以各种方式实现以在后台运行,只要它维护合同的硬件方面。

理论上,MMU 可能会决定为每个翻译(页面遍历)发出一组内存访问,以实现所需的行为。然而,由于它是一个性能关键元素,大多数 MMU 通过在 TLB 中缓存先前页面遍历的结果来优化这一点,就像缓存存储先前访问的结果一样(实际上,在某些实现中,缓存本身也可能存储一些访问页表,因为它通常驻留在可缓存内存中)。 MMU 可以管理多个 TLB(大多数实现将数据和代码页的 TLB 分开,有些具有 2 级 TLB),并从那里提供翻译,除了更快的访问时间之外,您不会注意到这一点。

还应该注意的是,硬件必须防范许多可能损害此类 TLB“缓存”先前翻译的一致性的极端情况,例如使用期间的页面别名或重新映射。在某些机器上,更恶劣的情况甚至需要称为 TLB 击落的大量刷新流。

【讨论】:

  • 更具体地解决关于内核和用户空间分离的问题似乎是合适的。 (我认为 Linux 为内核空间使用(全局)负地址,而对于 x86,这需要分层页表顶部的一页(每个地址空间),其上半部分(负)映射内核子表。我认为 ARM 支持单独的全局页表,大概是 Linux 内核使用的。Linux 不使用 Power 的散列页表作为主表;较新的目录条目缓存系统确实适合 Linux 的主表格式。
猜你喜欢
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
相关资源
最近更新 更多