- 论坛徽章:
- 0
|
最近看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的值,就是具体的物理地址。是这么简单的映射吗? |
|