4 #include <lunaix/mm/pagetable.h>
5 #include <lunaix/process.h>
6 #include <lunaix/types.h>
7 // Virtual memory manager
18 * @brief 映射模式:不作实际映射。该功能用于预留出特定的地址空间
24 * @brief 映射页墙:将虚拟地址映射为页墙,忽略给定的物理地址和页属性
27 #define VMAP_GUARDPAGE 4
30 * @brief 规定下一个可用页映射应当限定在指定的4MB地址空间内
43 * @brief 在指定地址空间中,添加一个映射
52 vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pte_attr_t prot);
55 vmm_set_ptes_contig(pte_t* ptep, pte_t pte, size_t lvl_size, size_t n)
59 pte_val(pte) += lvl_size;
65 vmm_set_ptes(pte_t* ptep, pte_t pte, size_t n)
75 vmm_unset_ptes(pte_t* ptep, size_t n)
78 set_pte(ptep, null_pte);
93 vmm_del_mapping(ptr_t mnt, ptr_t va);
96 vmm_tryptep(pte_t* ptep, size_t lvl_size);
99 * @brief 在指定的虚拟地址空间里查找一个映射
103 * @param mapping 映射相关属性
107 vmm_lookupat(ptr_t mnt, ptr_t va, pte_t* pte_out)
109 pte_t pte = vmm_tryptep(mkptep_va(mnt, va), LFT_SIZE);
112 return !pte_isnull(pte);
117 * @brief (COW) 为虚拟页创建副本。
119 * @return void* 包含虚拟页副本的物理页地址。
123 vmm_dup_page(ptr_t pa);
126 * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
128 * @param pde 页目录的物理地址
132 vms_mount(ptr_t mnt, ptr_t pde);
135 * @brief 卸载已挂载的虚拟地址空间
139 vms_unmount(ptr_t mnt);
142 mount_page(ptr_t mnt, ptr_t pa) {
144 pte_t* ptep = mkptep_va(VMS_SELF, mnt);
145 set_pte(ptep, mkpte(pa, KERNEL_DATA));
151 unmount_page(ptr_t mnt) {
152 pte_t* ptep = mkptep_va(VMS_SELF, mnt);
153 set_pte(ptep, null_pte);
158 vmm_ioremap(ptr_t paddr, size_t size);
161 vmm_next_free(ptr_t start, int options);
164 * @brief 将指定地址空间的虚拟地址转译为物理地址
171 vmm_v2pat(ptr_t mnt, ptr_t va);
174 * @brief 将当前地址空间的虚拟地址转译为物理地址。
182 return vmm_v2pat(VMS_SELF, va);
186 * @brief Maps a number of contiguous ptes in kernel
189 * @param pte the pte to be mapped
190 * @param lvl_size size of the page pointed by the given pte
191 * @param n number of ptes
195 vmap_ptes_at(pte_t pte, size_t lvl_size, int n);
198 * @brief Maps a number of contiguous ptes in kernel
199 * address space (leaf page size)
201 * @param pte the pte to be mapped
202 * @param n number of ptes
206 vmap_leaf_ptes(pte_t pte, int n)
208 return vmap_ptes_at(pte, LFT_SIZE, n);
212 * @brief Maps a contiguous range of physical address
213 * into kernel address space (leaf page size)
215 * @param paddr start of the physical address range
216 * @param size size of the physical range
217 * @param prot default protection to be applied
221 vmap(ptr_t paddr, size_t size, pte_attr_t prot)
223 pte_t _pte = mkpte(paddr, prot);
224 return vmap_ptes_at(_pte, LFT_SIZE, leaf_count(size));
227 #endif /* __LUNAIX_VMM_H */