refactor: simplify the vmm design, single responsibility. But using it should with...
[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 /**
10  * @brief 初始化虚拟内存管理器
11  *
12  */
13 void
14 vmm_init();
15
16 /**
17  * @brief 创建一个页目录
18  *
19  * @return ptd_entry* 页目录的物理地址,随时可以加载进CR3
20  */
21 x86_page_table*
22 vmm_init_pd();
23
24 /**
25  * @brief 在指定地址空间中,添加一个映射
26  *
27  * @param mnt 地址空间挂载点
28  * @param va 虚拟地址
29  * @param pa 物理地址
30  * @param attr 映射属性
31  * @return int
32  */
33 int
34 vmm_set_mapping(uintptr_t mnt, uintptr_t va, uintptr_t pa, pt_attr attr);
35
36 /**
37  * @brief 删除一个映射
38  *
39  * @param mnt
40  * @param pid
41  * @param va
42  * @return int
43  */
44 int
45 vmm_del_mapping(uintptr_t mnt, uintptr_t va);
46
47 /**
48  * @brief 查找一个映射
49  *
50  * @param va 虚拟地址
51  * @return v_mapping 映射相关属性
52  */
53 int
54 vmm_lookup(uintptr_t va, v_mapping* mapping);
55
56 /**
57  * @brief (COW) 为虚拟页创建副本。
58  *
59  * @return void* 包含虚拟页副本的物理页地址。
60  *
61  */
62 void*
63 vmm_dup_page(pid_t pid, void* pa);
64
65 /**
66  * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
67  *
68  * @param pde 页目录的物理地址
69  * @return void*
70  */
71 void*
72 vmm_mount_pd(uintptr_t mnt, void* pde);
73
74 /**
75  * @brief 卸载已挂载的虚拟地址空间
76  *
77  */
78 void*
79 vmm_unmount_pd(uintptr_t mnt);
80
81 #endif /* __LUNAIX_VMM_H */