我对linux内核和MMU之间的关系有疑问。我现在明白了 linux 内核管理虚拟内存地址和物理内存地址之间的页表。同时x86架构中还有MMU,管理虚拟内存地址和物理内存地址之间的页表。如果 MMU 出现在 CPU 附近,内核还需要处理页表吗?
这个问题可能很愚蠢,但另一个问题是,如果 MMU 负责内存空间,那么谁来管理高内存和低内存?我相信内核将从MMU(32位4GB)接收虚拟内存大小,然后内核将区分虚拟地址中的用户空间和内核空间。我对么?还是完全错误?
提前非常感谢!
我对linux内核和MMU之间的关系有疑问。我现在明白了 linux 内核管理虚拟内存地址和物理内存地址之间的页表。同时x86架构中还有MMU,管理虚拟内存地址和物理内存地址之间的页表。如果 MMU 出现在 CPU 附近,内核还需要处理页表吗?
这个问题可能很愚蠢,但另一个问题是,如果 MMU 负责内存空间,那么谁来管理高内存和低内存?我相信内核将从MMU(32位4GB)接收虚拟内存大小,然后内核将区分虚拟地址中的用户空间和内核空间。我对么?还是完全错误?
提前非常感谢!
OS 和 MMU 页面管理职责是同一机制的两个方面,位于架构和微架构之间的边界。
第一面定义了硬件和在其上运行的软件(在本例中为操作系统)之间的“契约”——如果您想使用虚拟内存,则需要按照该契约中的描述构建和维护一个页表。另一方面,MMU 端是一个硬件单元,负责执行地址转换的硬件任务。这可能包括也可能不包括硬件优化,这些通常是隐藏的,并且可以以各种方式实现以在后台运行,只要它维护合同的硬件方面。
理论上,MMU 可以决定为每个翻译(页面遍历)发出一组内存访问,以实现所需的行为。然而,由于它是一个性能关键元素,大多数 MMU 通过在 TLB 中缓存先前页面遍历的结果来优化这一点,就像缓存存储先前访问的结果一样(实际上,在某些实现中,缓存本身也可能存储一些访问页表,因为它通常驻留在可缓存内存中)。MMU 可以管理多个 TLB(大多数实现将数据和代码页的 TLB 分开,有些具有 2 级 TLB),并从那里提供翻译,除了更快的访问时间之外,您不会注意到这一点。
还应该注意的是,硬件必须防范许多可能损害先前翻译的这种 TLB“缓存”的一致性的极端情况,例如使用期间的页面别名或重新映射。在某些机器上,更恶劣的情况甚至需要称为 TLB 击落的大量冲洗流。