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