3 #include <lunaix/mm/page.h>
4 #include <lunaix/process.h>
5 #include <lunaix/types.h>
6 // Virtual memory manager
17 * @brief 映射模式:不作实际映射。该功能用于预留出特定的地址空间
23 * @brief 映射页墙:将虚拟地址映射为页墙,忽略给定的物理地址和页属性
26 #define VMAP_GUARDPAGE 4
29 * @brief 规定下一个可用页映射应当限定在指定的4MB地址空间内
44 * @return ptd_entry* 页目录的物理地址,随时可以加载进CR3
50 * @brief 在指定地址空间中,添加一个映射
59 vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pt_attr attr, int options);
70 vmm_del_mapping(ptr_t mnt, ptr_t va);
73 * @brief 在当前虚拟地址空间里查找一个映射
76 * @param mapping 映射相关属性
79 vmm_lookup(ptr_t va, v_mapping* mapping);
82 * @brief 在指定的虚拟地址空间里查找一个映射
86 * @param mapping 映射相关属性
90 vmm_lookupat(ptr_t mnt, ptr_t va, v_mapping* mapping);
93 * @brief (COW) 为虚拟页创建副本。
95 * @return void* 包含虚拟页副本的物理页地址。
99 vmm_dup_page(ptr_t pa);
102 * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
104 * @param pde 页目录的物理地址
108 vmm_mount_pd(ptr_t mnt, ptr_t pde);
111 * @brief 卸载已挂载的虚拟地址空间
115 vmm_unmount_pd(ptr_t mnt);
118 vmm_mount_pg(ptr_t mnt, ptr_t pa) {
120 vmm_set_mapping(VMS_SELF, mnt, pa, PG_PREM_RW, 0);
125 vmm_unmount_pg(ptr_t mnt) {
126 vmm_del_mapping(VMS_SELF, mnt);
131 vmm_ioremap(ptr_t paddr, size_t size);
134 vmm_next_free(ptr_t start, int options);
137 * @brief 将当前地址空间的虚拟地址转译为物理地址。
146 * @brief 将指定地址空间的虚拟地址转译为物理地址
153 vmm_v2pat(ptr_t mnt, ptr_t va);
157 (One must not get confused with vmap_area in Linux!)
167 * @brief 将连续的物理地址空间映射到内核虚拟地址空间
169 * @param paddr 物理地址空间的基地址
170 * @param size 物理地址空间的大小
174 vmap(ptr_t paddr, size_t size, pt_attr attr, int flags);
177 * @brief 创建一个 vmap 区域
184 vmap_varea(size_t size, pt_attr attr);
187 * @brief 在 vmap区域内映射一个单页
194 vmap_area_page(struct vmap_area* area, ptr_t paddr, pt_attr attr);
197 * @brief 在 vmap区域删除一个已映射的页
203 vmap_area_rmpage(struct vmap_area* area, ptr_t vaddr);
205 #endif /* __LUNAIX_VMM_H */