- uintptr_t pd_offset = PD_INDEX(va);
- uintptr_t pt_offset = PT_INDEX(va);
- ptd_t* ptd = (ptd_t*)PTD_BASE_VADDR;
-
- // 在页表与页目录中找到一个可用的空位进行映射(位于va或其附近)
- ptd_t* pde = ptd[pd_offset];
- pt_t* pt = (uintptr_t)PT_VADDR(pd_offset);
- while (pde && pd_offset < 1024) {
- if (pt_offset == 1024) {
- pd_offset++;
- pt_offset = 0;
- pde = ptd[pd_offset];
- pt = (pt_t*)PT_VADDR(pd_offset);
- }
- // 页表有空位,只需要开辟一个新的 PTE
- if (pt && !pt[pt_offset]) {
- pt[pt_offset] = PTE(tattr, pa);
- return V_ADDR(pd_offset, pt_offset, PG_OFFSET(va));
- }
- pt_offset++;
- }
-
- // 页目录与所有页表已满!
- if (pd_offset > 1024) {
- return NULL;
- }
+ptr_t
+vmm_v2pat(ptr_t mnt, ptr_t va)
+{
+ ptr_t va_off = va_offset(va);
+ pte_t* ptep = mkptep_va(mnt, va);