/** * Check page table */ void check_pgdir(void) { assert(npage <= KMEMSIZE / PGSIZE); assert(boot_pgdir != NULL && (uint32_t) PGOFF(boot_pgdir) == 0); assert(get_page(boot_pgdir, TEST_PAGE, NULL) == NULL); struct Page *p1, *p2; p1 = alloc_page(); assert(page_insert(boot_pgdir, p1, TEST_PAGE, 0) == 0); pte_t *ptep, perm; assert((ptep = get_pte(boot_pgdir, TEST_PAGE, 0)) != NULL); assert(pa2page(*ptep) == p1); assert(page_ref(p1) == 1); ptep = &((pte_t *) KADDR(PTE_ADDR(boot_pgdir[PDX(TEST_PAGE)])))[1]; assert(get_pte(boot_pgdir, TEST_PAGE + PGSIZE, 0) == ptep); p2 = alloc_page(); ptep_unmap(&perm); ptep_set_u_read(&perm); ptep_set_u_write(&perm); assert(page_insert(boot_pgdir, p2, TEST_PAGE + PGSIZE, perm) == 0); assert((ptep = get_pte(boot_pgdir, TEST_PAGE + PGSIZE, 0)) != NULL); assert(ptep_u_read(ptep)); assert(ptep_u_write(ptep)); assert(ptep_u_read(&(boot_pgdir[PDX(TEST_PAGE)]))); assert(page_ref(p2) == 1); assert(page_insert(boot_pgdir, p1, TEST_PAGE + PGSIZE, 0) == 0); assert(page_ref(p1) == 2); assert(page_ref(p2) == 0); assert((ptep = get_pte(boot_pgdir, TEST_PAGE + PGSIZE, 0)) != NULL); assert(pa2page(*ptep) == p1); assert(!ptep_u_read(ptep)); page_remove(boot_pgdir, TEST_PAGE); assert(page_ref(p1) == 1); assert(page_ref(p2) == 0); page_remove(boot_pgdir, TEST_PAGE + PGSIZE); assert(page_ref(p1) == 0); assert(page_ref(p2) == 0); assert(page_ref(pa2page(boot_pgdir[PDX(TEST_PAGE)])) == 1); free_page(pa2page(boot_pgdir[PDX(TEST_PAGE)])); boot_pgdir[PDX(TEST_PAGE)] = 0; exit_range(boot_pgdir, TEST_PAGE, TEST_PAGE + PGSIZE); kprintf("check_pgdir() succeeded.\n"); }
void exit_mmap(struct mm_struct *mm) { assert(mm != NULL && mm_count(mm) == 0); pde_t *pgdir = mm->pgdir; list_entry_t *list = &(mm->mmap_list), *le = list; while ((le = list_next(le)) != list) { struct vma_struct *vma = le2vma(le, list_link); unmap_range(pgdir, vma->vm_start, vma->vm_end); } while ((le = list_next(le)) != list) { struct vma_struct *vma = le2vma(le, list_link); exit_range(pgdir, vma->vm_start, vma->vm_end); } }
void exit_mmap(struct mm_struct *mm) { assert(mm != NULL && mm_count(mm) == 0); pgd_t *pgdir = mm->pgdir; list_entry_t *list = &(mm->mmap_list), *le = list; while ((le = list_next(le)) != list) { struct vma_struct *vma = le2vma(le, list_link); unmap_range(pgdir, vma->vm_start, vma->vm_end); #ifdef UCONFIG_BIONIC_LIBC vma_unmapfile(vma); #endif //UCONFIG_BIONIC_LIBC } while ((le = list_next(le)) != list) { struct vma_struct *vma = le2vma(le, list_link); exit_range(pgdir, vma->vm_start, vma->vm_end); } }