4 #include <lunaix/mm/pagetable.h>
5 #include <lunaix/mm/vmtlb.h>
6 #include <lunaix/process.h>
7 #include <lunaix/types.h>
10 vmm_set_ptes_contig(pte_t* ptep, pte_t pte, size_t lvl_size, size_t n)
14 pte_val(pte) += lvl_size;
20 vmm_set_ptes(pte_t* ptep, pte_t pte, size_t n)
30 vmm_unset_ptes(pte_t* ptep, size_t n)
33 set_pte(ptep, null_pte);
39 vmm_tryptep(pte_t* ptep, size_t lvl_size);
42 * @brief 在指定的虚拟地址空间里查找一个映射
46 * @param mapping 映射相关属性
50 vmm_lookupat(ptr_t mnt, ptr_t va, pte_t* pte_out)
52 pte_t pte = vmm_tryptep(mkptep_va(mnt, va), LFT_SIZE);
55 return !pte_isnull(pte);
59 * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
65 vms_mount(ptr_t mnt, ptr_t pde);
72 vms_unmount(ptr_t mnt);
75 mount_page(ptr_t mnt, ptr_t pa) {
77 pte_t* ptep = mkptep_va(VMS_SELF, mnt);
78 set_pte(ptep, mkpte(pa, KERNEL_DATA));
80 tlb_flush_kernel(mnt);
85 unmount_page(ptr_t mnt) {
86 pte_t* ptep = mkptep_va(VMS_SELF, mnt);
87 set_pte(ptep, null_pte);
89 tlb_flush_kernel(mnt);
94 * @brief 将当前地址空间的虚拟地址转译为物理地址。
102 pte_t* ptep = mkptep_va(VMS_SELF, va);
103 return pte_paddr(pte_at(ptep)) + va_offset(va);
107 vmap_set_start(ptr_t start_addr);
109 #endif /* __LUNAIX_VMM_H */