我的问题是在handle_mm_fault函数或任何S / W页表行走。
pgd = pgd_offset(mm,address);
pud = pud_offset (pgd,address);
pmd = pmd_offset (pud,address);
pte = pte_offset_map(pmd,address);
最终计算的pte是ARM还是LINUX版本?
在armv7中支持2级页面表;在第一级,每4个字节的4096个条目具有第二级的地址。第二级每4个字节有256个条目。 Linux已经调整了页表,每个8字节有2048个条目,换句话说,有两个指向第二级页表的指针,其中有512个条目连续放置。 Linux PTE存储在这些512 ARM PTE下面。
所以我理解S / W中的页表遍历只会导致ARM PTE,但这不正确Linux总是在Linux PTE上运行?
请告诉我哪里错了?
我得到了答案。 据我所知,所有这些宏只会导致Linux PTE,因为4kb大小的L2级页表和从第0个偏移的linux pte0开始和第1024个偏移linux pte1开始。在计算pte_index时,它会屏蔽PMD值的低12位,因此PMD将始终指向页面的开头并存储Linux PTE。
答案 0 :(得分:0)
我得到了答案。据我所知,所有这些宏只会导致Linux PTE,因为4kb大小的L2级页表和从第0个偏移的linux pte0开始和第1024个偏移linux pte1开始。在计算pte_index时,它会屏蔽PMD值的低12位,因此PMD将始终指向页面的开头并存储Linux PTE。