bd074c54d41b2466e1455fa7c0e8aee365d6384a
[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  * @brief 映射模式:忽略已存在映射
12  *
13  */
14 #define VMAP_IGNORE 1
15 /**
16  * @brief 映射模式:不作实际映射。该功能用于预留出特定的地址空间
17  *
18  */
19 #define VMAP_NOMAP 2
20
21 /**
22  * @brief 初始化虚拟内存管理器
23  *
24  */
25 void
26 vmm_init();
27
28 /**
29  * @brief 创建一个页目录
30  *
31  * @return ptd_entry* 页目录的物理地址,随时可以加载进CR3
32  */
33 x86_page_table*
34 vmm_init_pd();
35
36 /**
37  * @brief 在指定地址空间中,添加一个映射
38  *
39  * @param mnt 地址空间挂载点
40  * @param va 虚拟地址
41  * @param pa 物理地址
42  * @param attr 映射属性
43  * @return int
44  */
45 int
46 vmm_set_mapping(uintptr_t mnt,
47                 uintptr_t va,
48                 uintptr_t pa,
49                 pt_attr attr,
50                 int options);
51
52 /**
53  * @brief 删除一个映射
54  *
55  * @param mnt
56  * @param pid
57  * @param va
58  * @return int
59  */
60 uintptr_t
61 vmm_del_mapping(uintptr_t mnt, uintptr_t va);
62
63 /**
64  * @brief 查找一个映射
65  *
66  * @param va 虚拟地址
67  * @return v_mapping 映射相关属性
68  */
69 int
70 vmm_lookup(uintptr_t va, v_mapping* mapping);
71
72 /**
73  * @brief (COW) 为虚拟页创建副本。
74  *
75  * @return void* 包含虚拟页副本的物理页地址。
76  *
77  */
78 void*
79 vmm_dup_page(pid_t pid, void* pa);
80
81 void*
82 vmm_dup_vmspace(pid_t pid);
83
84 /**
85  * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
86  *
87  * @param pde 页目录的物理地址
88  * @return void*
89  */
90 void*
91 vmm_mount_pd(uintptr_t mnt, void* pde);
92
93 /**
94  * @brief 卸载已挂载的虚拟地址空间
95  *
96  */
97 void*
98 vmm_unmount_pd(uintptr_t mnt);
99
100 #endif /* __LUNAIX_VMM_H */