ARM架构中PMD,PTE与page之间的关系求解!
最近看ARM架构的内存页表的管理代码,有些疑问搞不清楚。ARMv7采用的是2level的管理模式,所以PMD等同于PGD。当一个虚拟地址addr在kernel中映射时,先根据addr算出PGD,然后根据PGD得到PTE,在根据PTE如何能得到该虚拟地址addr的物理地址?
有如下一下疑问:
1. 根据pmd算pte时,一般使用的是kernel中的pte_offset_map函数static inline pte_t *pmd_page_vaddr(pmd_t pmd)
{
return __va(pmd_val(pmd) & PHYS_MASK & (s32)PAGE_MASK);
}
#define __pte_map(pmd) pmd_page_vaddr(*(pmd))
#define pte_offset_map(pmd,addr) (__pte_map(pmd) + pte_index(addr))根据代码看来,PMD指针指向的内存中保存的值低12位是没有使用的,因为分配pte时,同时分配的linux pt and h/w pt,刚好是1个page,理论上这个PMD指针指向的值应为是4k对齐才对,为何在去PTE时,需要& PAGE_MASK?
2. pte指针指向的值,低十二位用来表示该映射的page的属性值,高12位就为pfn,但是最终是如何映射到虚拟地址addr的物理地址的嗫?看网友有句话写的,感觉有点问题:PTE表中的高20bit的值 + 线性地址的低 12bit的值,就是具体的物理地址。是这么简单的映射吗? 又研究了一下kernel,结合网友的分析,自己解释如下:
1. 确实地址是对齐的,但是kernel在实现时,为了节省mem,在低12bit中保存了该页目录的属性,所以在取值赋给PTE时需要clear低12bit;
2. 就是这样简单的映射,但是写了个程序,感觉非kernel线性地址的虚拟地址转换好像没有问题,但是相反线性地址范围不对;奇怪
页:
[1]