table walk in armv7 linux by S/W 导致页面 table ARM PTE 或 Linux PTE 的哪个版本
page table walk in armv7 linux by S/W leads to which version of page table ARM PTE or Linux PTE
我的问题在 handle_mm_fault 功能或任何 S/W 页面 table 走。
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级页面table;在第一层,每 4 个字节的 4096 个条目都有一个用于第二层的地址。第二级有 256 个条目,每 4 个字节。 Linux 已将页面 table 调整为每 8 个字节有 2048 个条目,换句话说,有两个指向页面 table 第二级的指针,其中有 512 个条目连续放置。 LinuxPTE下面存放了这512个ARM PTE。
所以我明白 table 在 S/W 中遍历页面只会导致 ARM PTE,但这是不正确的 Linux 总是在 Linux PTE 上运行?
请告诉我哪里错了?
我找到答案了。
我知道,所有这些宏只会导致 Linux PTE,因为 L2 级页面 table 的大小为 4kb,并且从第 0 个偏移量开始 linux pte0 开始,第 1024 个偏移量 linux pte1 开始。在计算 pte_index 时,它屏蔽了 PMD 值的低 12 位,因此 PMD 将始终指向页面的开头,并且存储了 Linux PTE。
我得到了答案。我知道,所有这些宏只会导致 Linux PTE,因为 L2 级页面 table 的大小为 4kb,并且从第 0 个偏移量开始 linux pte0 开始,第 1024 个偏移量 linux pte1 开始。在计算 pte_index 时,它屏蔽了 PMD 值的低 12 位,因此 PMD 将始终指向页面的开头,并且存储了 Linux PTE。
我的问题在 handle_mm_fault 功能或任何 S/W 页面 table 走。
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级页面table;在第一层,每 4 个字节的 4096 个条目都有一个用于第二层的地址。第二级有 256 个条目,每 4 个字节。 Linux 已将页面 table 调整为每 8 个字节有 2048 个条目,换句话说,有两个指向页面 table 第二级的指针,其中有 512 个条目连续放置。 LinuxPTE下面存放了这512个ARM PTE。
所以我明白 table 在 S/W 中遍历页面只会导致 ARM PTE,但这是不正确的 Linux 总是在 Linux PTE 上运行?
请告诉我哪里错了?
我找到答案了。 我知道,所有这些宏只会导致 Linux PTE,因为 L2 级页面 table 的大小为 4kb,并且从第 0 个偏移量开始 linux pte0 开始,第 1024 个偏移量 linux pte1 开始。在计算 pte_index 时,它屏蔽了 PMD 值的低 12 位,因此 PMD 将始终指向页面的开头,并且存储了 Linux PTE。
我得到了答案。我知道,所有这些宏只会导致 Linux PTE,因为 L2 级页面 table 的大小为 4kb,并且从第 0 个偏移量开始 linux pte0 开始,第 1024 个偏移量 linux pte1 开始。在计算 pte_index 时,它屏蔽了 PMD 值的低 12 位,因此 PMD 将始终指向页面的开头,并且存储了 Linux PTE。