Merge branch 'interrupt-rework' into prog-loader
[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(uintptr_t mnt,
53                 uintptr_t va,
54                 uintptr_t pa,
55                 pt_attr attr,
56                 int options);
57
58 /**
59  * @brief 删除一个映射
60  *
61  * @param mnt
62  * @param pid
63  * @param va
64  * @return int
65  */
66 uintptr_t
67 vmm_del_mapping(uintptr_t mnt, uintptr_t va);
68
69 /**
70  * @brief 在当前虚拟地址空间里查找一个映射
71  *
72  * @param va 虚拟地址
73  * @param mapping 映射相关属性
74  */
75 int
76 vmm_lookup(uintptr_t va, v_mapping* mapping);
77
78 /**
79  * @brief 在指定的虚拟地址空间里查找一个映射
80  *
81  * @param mnt 地址空间锚定点
82  * @param va 虚拟地址
83  * @param mapping 映射相关属性
84  * @return int
85  */
86 int
87 vmm_lookupat(ptr_t mnt, uintptr_t va, v_mapping* mapping);
88
89 /**
90  * @brief (COW) 为虚拟页创建副本。
91  *
92  * @return void* 包含虚拟页副本的物理页地址。
93  *
94  */
95 void*
96 vmm_dup_page(pid_t pid, void* pa);
97
98 void*
99 vmm_dup_vmspace(pid_t pid);
100
101 /**
102  * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
103  *
104  * @param pde 页目录的物理地址
105  * @return void*
106  */
107 void*
108 vmm_mount_pd(uintptr_t mnt, void* pde);
109
110 /**
111  * @brief 卸载已挂载的虚拟地址空间
112  *
113  */
114 void*
115 vmm_unmount_pd(uintptr_t mnt);
116
117 void*
118 vmm_ioremap(uintptr_t paddr, size_t size);
119
120 void*
121 vmm_next_free(uintptr_t start, int options);
122
123 /**
124  * @brief 将连续的物理地址空间映射到内核虚拟地址空间
125  *
126  * @param paddr 物理地址空间的基地址
127  * @param size 物理地址空间的大小
128  * @return void*
129  */
130 void*
131 vmm_vmap(uintptr_t paddr, size_t size, pt_attr attr);
132
133 /**
134  * @brief 将当前地址空间的虚拟地址转译为物理地址。
135  *
136  * @param va 虚拟地址
137  * @return void*
138  */
139 void*
140 vmm_v2p(void* va);
141
142 /**
143  * @brief 将指定地址空间的虚拟地址转译为物理地址
144  *
145  * @param mnt 地址空间锚定点
146  * @param va 虚拟地址
147  * @return void*
148  */
149 void*
150 vmm_v2pat(ptr_t mnt, void* va);
151
152 #endif /* __LUNAIX_VMM_H */