4 #include <lunaix/mm/pagetable.h>
5 #include <lunaix/mm/vmtlb.h>
6 #include <lunaix/process.h>
7 #include <lunaix/types.h>
17 vmm_set_ptes_contig(pte_t* ptep, pte_t pte, size_t lvl_size, size_t n)
21 pte_val(pte) += lvl_size;
27 vmm_set_ptes(pte_t* ptep, pte_t pte, size_t n)
37 vmm_unset_ptes(pte_t* ptep, size_t n)
40 set_pte(ptep, null_pte);
46 vmm_tryptep(pte_t* ptep, size_t lvl_size);
49 * @brief 在指定的虚拟地址空间里查找一个映射
53 * @param mapping 映射相关属性
57 vmm_lookupat(ptr_t mnt, ptr_t va, pte_t* pte_out)
59 pte_t pte = vmm_tryptep(mkptep_va(mnt, va), LFT_SIZE);
62 return !pte_isnull(pte);
66 * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
72 vms_mount(ptr_t mnt, ptr_t pde);
79 vms_unmount(ptr_t mnt);
82 mount_page(ptr_t mnt, ptr_t pa) {
84 pte_t* ptep = mkptep_va(VMS_SELF, mnt);
85 set_pte(ptep, mkpte(pa, KERNEL_DATA));
87 tlb_flush_kernel(mnt);
92 unmount_page(ptr_t mnt) {
93 pte_t* ptep = mkptep_va(VMS_SELF, mnt);
94 set_pte(ptep, null_pte);
96 tlb_flush_kernel(mnt);
101 * @brief 将当前地址空间的虚拟地址转译为物理地址。
109 pte_t* ptep = mkptep_va(VMS_SELF, va);
110 return pte_paddr(pte_at(ptep)) + va_offset(va);
114 vmap_set_start(ptr_t start_addr);
116 #endif /* __LUNAIX_VMM_H */