Merge branch 'device-sys'
[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  * @return v_mapping 映射相关属性
74  */
75 int
76 vmm_lookup(uintptr_t va, v_mapping* mapping);
77
78 /**
79  * @brief (COW) 为虚拟页创建副本。
80  *
81  * @return void* 包含虚拟页副本的物理页地址。
82  *
83  */
84 void*
85 vmm_dup_page(pid_t pid, void* pa);
86
87 void*
88 vmm_dup_vmspace(pid_t pid);
89
90 /**
91  * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
92  *
93  * @param pde 页目录的物理地址
94  * @return void*
95  */
96 void*
97 vmm_mount_pd(uintptr_t mnt, void* pde);
98
99 /**
100  * @brief 卸载已挂载的虚拟地址空间
101  *
102  */
103 void*
104 vmm_unmount_pd(uintptr_t mnt);
105
106 void*
107 vmm_ioremap(uintptr_t paddr, size_t size);
108
109 void*
110 vmm_next_free(uintptr_t start, int options);
111
112 /**
113  * @brief 将连续的物理地址空间映射到内核虚拟地址空间
114  *
115  * @param paddr 物理地址空间的基地址
116  * @param size 物理地址空间的大小
117  * @return void*
118  */
119 void*
120 vmm_vmap(uintptr_t paddr, size_t size, pt_attr attr);
121
122 void*
123 vmm_v2p(void* va);
124
125 #endif /* __LUNAIX_VMM_H */