- // 在页表与页目录中找到一个可用的空位进行映射(位于va或其附近)
- ptd_t pde = ptd[pd_offset];
- pt_t* pt = (pt_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 (void*)V_ADDR(pd_offset, pt_offset, PG_OFFSET(va));
- }
- pt_offset++;
- }
-
- // 页目录与所有页表已满!
- if (pd_offset > 1024) {
- return NULL;
- }
-
- // 页目录有空位,需要开辟一个新的 PDE
- uint8_t* new_pt_pa = pmm_alloc_page();
-
- // 物理内存已满!
- if (!new_pt_pa) {
- return NULL;
- }
-
- ptd[pd_offset] = PDE(dattr, new_pt_pa);
-
- memset((void*)PT_VADDR(pd_offset), 0, PM_PAGE_SIZE);
- pt[pt_offset] = PTE(tattr, pa);
-
- return (void*)V_ADDR(pd_offset, pt_offset, PG_OFFSET(va));
+ pte_t* ptep = mkl0tep_va(VMS_SELF, mnt);
+ set_pte(ptep, mkpte(vms_root, KERNEL_PGTAB));
+ tlb_flush_kernel(mnt);
+ return mnt;