feat: added ability to identify process vm regions
[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 #include <lunaix/mm/pmm.h>
8 // Virtual memory manager
9
10 /**
11  * @brief 初始化虚拟内存管理器
12  *
13  */
14 void
15 vmm_init();
16
17 /**
18  * @brief 创建一个页目录
19  *
20  * @return ptd_entry* 页目录的物理地址,随时可以加载进CR3
21  */
22 x86_page_table*
23 vmm_init_pd();
24
25 /**
26  * @brief 尝试建立一个映射关系。映射指定的物理页地址至虚拟页地址,如果指定的虚拟页地址已被占用
27  * 则尝试寻找新的可用地址(该地址总是大于指定的地址)。
28  *
29  * @param vpn 虚拟页地址
30  * @param pa 物理页地址
31  * @param dattr PDE 的属性
32  * @param tattr PTE 的属性
33  * @return 虚拟页地址,如不成功,则为 NULL
34  */
35 void*
36 vmm_map_page(pid_t pid, void* va, void* pa, pt_attr tattr);
37
38 /**
39  * @brief 建立一个映射关系,映射指定的物理页地址至虚拟页地址。如果指定的虚拟页地址已被占用,
40  * 则覆盖。
41  *
42  * @param va 虚拟页地址
43  * @param pa 物理页地址
44  * @param dattr PDE 的属性
45  * @param tattr PTE 的属性
46  * @return 虚拟页地址
47  */
48 void*
49 vmm_fmap_page(pid_t pid, void* va, void* pa, pt_attr tattr);
50
51 /**
52  * @brief 尝试为一个虚拟页地址创建一个可用的物理页映射
53  *
54  * @param va 虚拟页地址
55  * @return 虚拟页地址,如不成功,则为 NULL
56  */
57 void*
58 vmm_alloc_page(pid_t pid, void* va, void** pa, pt_attr tattr, pp_attr_t pattr);
59
60
61 /**
62  * @brief 尝试分配多个连续的虚拟页
63  * 
64  * @param va 起始虚拟地址
65  * @param sz 大小(必须为4K对齐)
66  * @param tattr 属性
67  * @return int 是否成功
68  */
69 int
70 vmm_alloc_pages(pid_t pid, void* va, size_t sz, pt_attr tattr, pp_attr_t pattr);
71
72 /**
73  * @brief 设置一个映射,如果映射已存在,则忽略。
74  * 
75  * @param va 
76  * @param pa 
77  * @param attr 
78  */
79 int
80 vmm_set_mapping(pid_t pid, void* va, void* pa, pt_attr attr);
81
82 /**
83  * @brief 删除并释放一个映射
84  *
85  * @param vpn
86  */
87 void
88 vmm_unmap_page(pid_t pid, void* va);
89
90 /**
91  * @brief 删除一个映射
92  *
93  * @param vpn
94  */
95 void
96 vmm_unset_mapping(void* va);
97
98 /**
99  * @brief 将虚拟地址翻译为其对应的物理映射
100  *
101  * @param va 虚拟地址
102  * @return void* 物理地址,如映射不存在,则为NULL
103  */
104 void*
105 vmm_v2p(void* va);
106
107 /**
108  * @brief 查找一个映射
109  *
110  * @param va 虚拟地址
111  * @return v_mapping 映射相关属性
112  */
113 v_mapping
114 vmm_lookup(void* va);
115
116 /**
117  * @brief (COW) 为虚拟页创建副本。
118  * 
119  * @return void* 包含虚拟页副本的物理页地址。
120  * 
121  */
122 void* vmm_dup_page(pid_t pid, void* pa);
123
124 /**
125  * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
126  * 
127  * @param pde 页目录的物理地址
128  * @return void* 
129  */
130 void*
131 vmm_mount_pd(uintptr_t mnt, void* pde);
132
133 /**
134  * @brief 卸载已挂载的虚拟地址空间
135  * 
136  */
137 void*
138 vmm_unmount_pd(uintptr_t mnt);
139
140 #endif /* __LUNAIX_VMM_H */