-void* vmm_map_page(void* va, void* pa, pt_attr dattr, pt_attr tattr) {
+int
+__vmm_map_internal(uint32_t l1_inx, uint32_t l2_inx, uintptr_t pa, pt_attr attr) {
+ ptd_t* l1pt = (ptd_t*)L1_BASE_VADDR;
+ pt_t* l2pt = (pt_t*)L2_VADDR(l1_inx);
+
+ // See if attr make sense
+ assert(attr <= 128);
+
+ if(!l1pt[l1_inx]) {
+ uint8_t* new_l1pt_pa = pmm_alloc_page();
+
+ // 物理内存已满!
+ if (!new_l1pt_pa) {
+ return 0;
+ }
+
+ l1pt[l1_inx] = NEW_L1_ENTRY(attr, new_l1pt_pa);
+ memset((void*)L2_VADDR(l1_inx), 0, PM_PAGE_SIZE);
+ }
+
+ l2pt[l2_inx] = NEW_L2_ENTRY(attr, pa);
+
+ return 1;
+}
+
+void*
+vmm_map_page(void* va, void* pa, pt_attr tattr)
+{