refactor: vmm_set_map has option to ignore existed mapping.
[lunaix-os.git] / lunaix-os / includes / lunaix / mm / vmm.h
1 #ifndef __LUNAIX_VMM_H
2 #define __LUNAIX_VMM_H
3 #include <lunaix/mm/page.h>
4 #include <lunaix/process.h>
5 #include <stddef.h>
6 #include <stdint.h>
7 // Virtual memory manager
8
9 #define VMAP_NULL 0
10 #define VMAP_IGNORE 1
11
12 /**
13  * @brief 初始化虚拟内存管理器
14  *
15  */
16 void
17 vmm_init();
18
19 /**
20  * @brief 创建一个页目录
21  *
22  * @return ptd_entry* 页目录的物理地址,随时可以加载进CR3
23  */
24 x86_page_table*
25 vmm_init_pd();
26
27 /**
28  * @brief 在指定地址空间中,添加一个映射
29  *
30  * @param mnt 地址空间挂载点
31  * @param va 虚拟地址
32  * @param pa 物理地址
33  * @param attr 映射属性
34  * @return int
35  */
36 int
37 vmm_set_mapping(uintptr_t mnt,
38                 uintptr_t va,
39                 uintptr_t pa,
40                 pt_attr attr,
41                 int options);
42
43 /**
44  * @brief 删除一个映射
45  *
46  * @param mnt
47  * @param pid
48  * @param va
49  * @return int
50  */
51 uintptr_t
52 vmm_del_mapping(uintptr_t mnt, uintptr_t va);
53
54 /**
55  * @brief 查找一个映射
56  *
57  * @param va 虚拟地址
58  * @return v_mapping 映射相关属性
59  */
60 int
61 vmm_lookup(uintptr_t va, v_mapping* mapping);
62
63 /**
64  * @brief (COW) 为虚拟页创建副本。
65  *
66  * @return void* 包含虚拟页副本的物理页地址。
67  *
68  */
69 void*
70 vmm_dup_page(pid_t pid, void* pa);
71
72 /**
73  * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
74  *
75  * @param pde 页目录的物理地址
76  * @return void*
77  */
78 void*
79 vmm_mount_pd(uintptr_t mnt, void* pde);
80
81 /**
82  * @brief 卸载已挂载的虚拟地址空间
83  *
84  */
85 void*
86 vmm_unmount_pd(uintptr_t mnt);
87
88 #endif /* __LUNAIX_VMM_H */