ARM Linux 如何模拟X86 PTE中的Present Young和Dirty标志位
注:本文是参考Kernel的代码并加上个人揣测,欢迎指正 在 X86 MMU Page table entry 中,有三个标志位在ARM 的MMU硬件所规定的Page table entry中不提供。这三个标志位的作用如下: PTE_DIRTY的作用:CPU在写操作的时候,处理器会将改位置位。说明对应的页被写过,是脏的。 PTE_YOUNG 的作用是:MMU 寻址是将该标志置位(在换出的时候,如果此标志位被置位,说明该地址刚刚被使用过,暂时不换出此 pte 对应的页,同时清除该标志位)。 PTE_PRESENT 的作用是: MMU 在访问 PTE 的时候,若 PTE_PRESENT 为 0 ,则将地址放在CR2寄存器中,同时触发Pagefault异常。 下图抓自:《Linux内核情景分析》 由于 Linux 最早是 build 在 X86 平台上的,因此移植到 ARM 后,也需要遵从 X86 的内存管理框架,模拟 ARM MMU 没有提供的 PTE_PRESENT , PTE_YOUNG 和 PTE_WRITE 。 下面的分析,参考了arch/arm/include/asm/pgtable-2level.h中的注释 Q: 如何模拟 PTE_ DIRTY ? A: ARM Linux 是通过 dirty 去标识某个页是否是可以 PTE_WRITE 的。 对于新分配的页,如果 Linux 版本的 PTE 没有 dirty 标识,对其进行写操作,会触发 MMU 异常。该异常会被 handle_pte_fault 处理 。 Q: 如何模拟 PTE_YOUNG? A: 这个 PTE_YOUNG 在内存被分配的时候置上,当解除映射的时候,将清掉该位。如果 Linux 版本的 PTE 的 young 位被清除了, MMU 使用的 PTE 版本的value是要清除的,但 TLB 并不刷新。 Q: 如何模拟 present : A: ARM 的 MMU 在访问的时候,不像 X86 的 MMU 那样 ( 只要看到 *pte 为 0 ,就判断该页压根没有被加载到内存中;若 *pte 不为 0 , PTE_PRESENT 位为 0 ,就能判断该被 swap out ...