refactor: use a more decent physical memory map
[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 <lunaix/types.h>
6 // Virtual memory manager
7
8 #define VMAP_NULL 0
9
10 /**
11  * @brief 映射模式:忽略已存在映射
12  *
13  */
14 #define VMAP_IGNORE 1
15
16 /**
17  * @brief 映射模式:不作实际映射。该功能用于预留出特定的地址空间
18  *
19  */
20 #define VMAP_NOMAP 2
21
22 /**
23  * @brief 规定下一个可用页映射应当限定在指定的4MB地址空间内
24  *
25  */
26 #define VALLOC_PDE 1
27
28 /**
29  * @brief 初始化虚拟内存管理器
30  *
31  */
32 void
33 vmm_init();
34
35 /**
36  * @brief 创建一个页目录
37  *
38  * @return ptd_entry* 页目录的物理地址,随时可以加载进CR3
39  */
40 x86_page_table*
41 vmm_init_pd();
42
43 /**
44  * @brief 在指定地址空间中,添加一个映射
45  *
46  * @param mnt 地址空间挂载点
47  * @param va 虚拟地址
48  * @param pa 物理地址
49  * @param attr 映射属性
50  * @return int
51  */
52 int
53 vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pt_attr attr, int options);
54
55 /**
56  * @brief 删除一个映射
57  *
58  * @param mnt
59  * @param pid
60  * @param va
61  * @return int
62  */
63 ptr_t
64 vmm_del_mapping(ptr_t mnt, ptr_t va);
65
66 /**
67  * @brief 在当前虚拟地址空间里查找一个映射
68  *
69  * @param va 虚拟地址
70  * @param mapping 映射相关属性
71  */
72 int
73 vmm_lookup(ptr_t va, v_mapping* mapping);
74
75 /**
76  * @brief 在指定的虚拟地址空间里查找一个映射
77  *
78  * @param mnt 地址空间锚定点
79  * @param va 虚拟地址
80  * @param mapping 映射相关属性
81  * @return int
82  */
83 int
84 vmm_lookupat(ptr_t mnt, ptr_t va, v_mapping* mapping);
85
86 /**
87  * @brief (COW) 为虚拟页创建副本。
88  *
89  * @return void* 包含虚拟页副本的物理页地址。
90  *
91  */
92 ptr_t
93 vmm_dup_page(pid_t pid, ptr_t pa);
94
95 ptr_t
96 vmm_dup_vmspace(pid_t pid);
97
98 /**
99  * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
100  *
101  * @param pde 页目录的物理地址
102  * @return ptr_t
103  */
104 ptr_t
105 vmm_mount_pd(ptr_t mnt, ptr_t pde);
106
107 /**
108  * @brief 卸载已挂载的虚拟地址空间
109  *
110  */
111 ptr_t
112 vmm_unmount_pd(ptr_t mnt);
113
114 void*
115 vmm_ioremap(ptr_t paddr, size_t size);
116
117 void*
118 vmm_next_free(ptr_t start, int options);
119
120 /**
121  * @brief 将当前地址空间的虚拟地址转译为物理地址。
122  *
123  * @param va 虚拟地址
124  * @return void*
125  */
126 ptr_t
127 vmm_v2p(ptr_t va);
128
129 /**
130  * @brief 将指定地址空间的虚拟地址转译为物理地址
131  *
132  * @param mnt 地址空间锚定点
133  * @param va 虚拟地址
134  * @return void*
135  */
136 ptr_t
137 vmm_v2pat(ptr_t mnt, ptr_t va);
138
139 /*
140     表示一个 vmap 区域
141     (One must not get confused with vmap_area in Linux!)
142 */
143 struct vmap_area
144 {
145     ptr_t start;
146     size_t size;
147     pt_attr area_attr;
148 };
149
150 /**
151  * @brief 将连续的物理地址空间映射到内核虚拟地址空间
152  *
153  * @param paddr 物理地址空间的基地址
154  * @param size 物理地址空间的大小
155  * @return void*
156  */
157 void*
158 vmap(ptr_t paddr, size_t size, pt_attr attr, int flags);
159
160 /**
161  * @brief 创建一个 vmap 区域
162  *
163  * @param paddr
164  * @param attr
165  * @return ptr_t
166  */
167 struct vmap_area*
168 vmap_varea(size_t size, pt_attr attr);
169
170 /**
171  * @brief 在 vmap区域内映射一个单页
172  *
173  * @param paddr
174  * @param attr
175  * @return ptr_t
176  */
177 ptr_t
178 vmap_area_page(struct vmap_area* area, ptr_t paddr, pt_attr attr);
179
180 /**
181  * @brief 在 vmap区域删除一个已映射的页
182  *
183  * @param paddr
184  * @return ptr_t
185  */
186 ptr_t
187 vmap_area_rmpage(struct vmap_area* area, ptr_t vaddr);
188
189 #endif /* __LUNAIX_VMM_H */