Linux kernel 通过S/W在armv7 linux中进行页表漫游,可以得出页表ARM PTE或linux PTE的版本

Linux kernel 通过S/W在armv7 linux中进行页表漫游,可以得出页表ARM PTE或linux PTE的版本,linux-kernel,arm,mmu,Linux Kernel,Arm,Mmu,我的问题在函数或任何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中支持两级页表;在第一级,每4个字节的4096个条目具有第二级的地址。第二级每4字节有256个条目。Linux对页面表进行了调整,使其每8字节有20

我的问题在函数或任何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中支持两级页表;在第一级,每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_索引时,它屏蔽PMD值的较低12位,因此PMD将始终指向页面的开头,并且存储了Linux pte

我得到了答案。我知道,所有这些宏只会导致Linux PTE,因为4kb大小的L2级页表从第0偏移量开始启动Linux pte0,第1024偏移量开始启动Linux pte1。在计算pte_索引时,它会屏蔽PMD值的较低12位,因此PMD将始终指向页面的开头,并且存储了Linux pte。

请参见:,尤其是第二部分。过一会儿我可能会回答。我想创建一个debugfs条目来duml特定进程的页表。我必须沿着pgd_偏移量到pte_偏移量的地图遍历页面表。。。当我看到这些宏的定义时,我相信最终计算的pte将是arm pte。但是作为Linux pte的仿真,我看起来计算的pte将是Linux pte。我感到困惑。