- 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 = (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);
+ uintptr_t l1_inx = L1_INDEX(va);
+ uintptr_t l2_inx = L2_INDEX(va);
+ x86_page_table* l1pt = (x86_page_table*)(mnt | (1023 << 12));
+ x86_page_table* l2pt = (x86_page_table*)(mnt | (l1_inx << 12));
+
+ // See if attr make sense
+ assert(attr <= 128);
+
+ if (!l1pt->entry[l1_inx]) {
+ x86_page_table* new_l1pt_pa = pmm_alloc_page(KERNEL_PID, PP_FGPERSIST);
+
+ // 物理内存已满!
+ if (!new_l1pt_pa) {
+ return 0;