- 论坛徽章:
- 0
|
这个函数定义在arch\arm\include\asm\pgtable.h
通常在pte_offset_map中被调用:
- #define pte_offset_map(dir,addr) (pmd_page_vaddr(*(dir)) + __pte_index(addr))
复制代码
pmd_page_vaddr()本身很小,贴在这里了:
- static inline pte_t *pmd_page_vaddr(pmd_t pmd)
- {
- unsigned long ptr;
- ptr = pmd_val(pmd) & ~(PTRS_PER_PTE * sizeof(void *) - 1);
- ptr += PTRS_PER_PTE * sizeof(void *);
- return __va(ptr);
- }
复制代码
我看了下,内核中如果需要得到最后一级页表项pte时需要会最终调用到pte_offset_map(),我的理解,在arm中硬件上只用到了一级页表,内核再次基础上又加了一级二级页表。
pmd_page_vaddr()函数似乎就是返回二级页表的地址,但这个页表的位置似乎很奇怪,pmd_val(pmd)得到的是真正的物理地址,按照代码,二级页表放在了这个物理地址后2k(512*4 byte)的地方。
我的理解不一定正确,大家看看这样理解正确不? |
|