博文

目前显示的是标签为“kernel”的博文

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 ...

在Kernel中system control寄存器(cp15 c1)的设置过程

图片
C1 寄存器 -system control register 的功能是起到 control 的作用,因此非常重要。虽然对每一位在 arch/arm/include/asm/system.h 头文件中都有 define ,但是 kernel 大部分并没有采用,而是直接设置了 magic number. 很不容易去看。因此在这里从头开始看 c1 寄存器是如何被设置的。 首先从 arch/arm/boot/compressed/head.S 开始看起, 从 cache_on 开始,  495  * On entry,  496  *  r4 = kernel execution address  497  *  r7 = architecture number  498  *  r8 = atags pointer  499  * On exit,  500  *  r0, r1, r2, r3, r9, r10, r12 corrupted  501  * This routine must preserve:  502  *  r4, r7, r8  503  */  504                 .align  5  505 cache_on:       mov     r3, #8                  @ cache_on function  506   ...