3f102db3fe3d20b0ba3d4287f624f817422a97ac
[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
11 /**
12  * @brief 映射模式:忽略已存在映射
13  *
14  */
15 #define VMAP_IGNORE 1
16
17 /**
18  * @brief 映射模式:不作实际映射。该功能用于预留出特定的地址空间
19  *
20  */
21 #define VMAP_NOMAP 2
22
23 /**
24  * @brief 规定下一个可用页映射应当限定在指定的4MB地址空间内
25  *
26  */
27 #define VALLOC_PDE 1
28
29 /**
30  * @brief 初始化虚拟内存管理器
31  *
32  */
33 void
34 vmm_init();
35
36 /**
37  * @brief 创建一个页目录
38  *
39  * @return ptd_entry* 页目录的物理地址,随时可以加载进CR3
40  */
41 x86_page_table*
42 vmm_init_pd();
43
44 /**
45  * @brief 在指定地址空间中,添加一个映射
46  *
47  * @param mnt 地址空间挂载点
48  * @param va 虚拟地址
49  * @param pa 物理地址
50  * @param attr 映射属性
51  * @return int
52  */
53 int
54 vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pt_attr attr, int options);
55
56 /**
57  * @brief 删除一个映射
58  *
59  * @param mnt
60  * @param pid
61  * @param va
62  * @return int
63  */
64 ptr_t
65 vmm_del_mapping(ptr_t mnt, ptr_t va);
66
67 /**
68  * @brief 在当前虚拟地址空间里查找一个映射
69  *
70  * @param va 虚拟地址
71  * @param mapping 映射相关属性
72  */
73 int
74 vmm_lookup(ptr_t va, v_mapping* mapping);
75
76 /**
77  * @brief 在指定的虚拟地址空间里查找一个映射
78  *
79  * @param mnt 地址空间锚定点
80  * @param va 虚拟地址
81  * @param mapping 映射相关属性
82  * @return int
83  */
84 int
85 vmm_lookupat(ptr_t mnt, ptr_t va, v_mapping* mapping);
86
87 /**
88  * @brief (COW) 为虚拟页创建副本。
89  *
90  * @return void* 包含虚拟页副本的物理页地址。
91  *
92  */
93 ptr_t
94 vmm_dup_page(pid_t pid, ptr_t pa);
95
96 ptr_t
97 vmm_dup_vmspace(pid_t pid);
98
99 /**
100  * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
101  *
102  * @param pde 页目录的物理地址
103  * @return ptr_t
104  */
105 ptr_t
106 vmm_mount_pd(ptr_t mnt, ptr_t pde);
107
108 /**
109  * @brief 卸载已挂载的虚拟地址空间
110  *
111  */
112 ptr_t
113 vmm_unmount_pd(ptr_t mnt);
114
115 void*
116 vmm_ioremap(ptr_t paddr, size_t size);
117
118 void*
119 vmm_next_free(ptr_t start, int options);
120
121 /**
122  * @brief 将连续的物理地址空间映射到内核虚拟地址空间
123  *
124  * @param paddr 物理地址空间的基地址
125  * @param size 物理地址空间的大小
126  * @return void*
127  */
128 void*
129 vmm_vmap(ptr_t paddr, size_t size, pt_attr attr);
130
131 /**
132  * @brief 将当前地址空间的虚拟地址转译为物理地址。
133  *
134  * @param va 虚拟地址
135  * @return void*
136  */
137 ptr_t
138 vmm_v2p(ptr_t va);
139
140 /**
141  * @brief 将指定地址空间的虚拟地址转译为物理地址
142  *
143  * @param mnt 地址空间锚定点
144  * @param va 虚拟地址
145  * @return void*
146  */
147 ptr_t
148 vmm_v2pat(ptr_t mnt, ptr_t va);
149
150 #endif /* __LUNAIX_VMM_H */