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