Virtual memory & paging
[lunaix-os.git] / lunaix-os / includes / lunaix / mm / vmm.h
1 #ifndef __LUNAIX_VMM_H
2 #define __LUNAIX_VMM_H
3 #include <stdint.h>
4 #include <stddef.h>
5 #include <lunaix/mm/page.h>
6 // Virtual memory manager
7
8 /**
9  * @brief 初始化虚拟内存管理器
10  * 
11  */
12 void vmm_init();
13
14 /**
15  * @brief 创建一个页目录
16  * 
17  * @return ptd_entry* 页目录的物理地址,随时可以加载进CR3
18  */
19 ptd_t* vmm_init_pd();
20
21 /**
22  * @brief 
23  * 尝试建立一个映射关系。映射指定的物理页地址至虚拟页地址,如果指定的虚拟页地址已被占用
24  * 则尝试寻找新的可用地址(改地址总是大于指定的地址)。
25  * 
26  * @param vpn 虚拟页地址
27  * @param ppn 物理页地址
28  * @param dattr PDE 的属性
29  * @param tattr PTE 的属性
30  * @return 虚拟页地址,如不成功,则为 NULL
31  */
32 void* vmm_map_page(void* vpn, void* ppn, pt_attr dattr, pt_attr tattr);
33
34 /**
35  * @brief 尝试为一个虚拟页地址创建一个可用的物理页映射
36  * 
37  * @param vpn 虚拟页地址
38  * @return 物理页地址,如不成功,则为 NULL
39  */
40 void* vmm_alloc_page(void* vpn, pt_attr dattr, pt_attr tattr);
41
42 /**
43  * @brief 删除一个映射
44  * 
45  * @param vpn 
46  */
47 void vmm_unmap_page(void* vpn);
48
49 ptd_t* get_pd();
50 void set_pd(ptd_t* pd);
51
52 /**
53  * @brief 将虚拟地址翻译为其对应的物理映射
54  * 
55  * @param va 虚拟地址
56  * @return void* 物理地址,如映射不存在,则为NULL
57  */
58 void* vmm_v2p(void* va);
59
60 #endif /* __LUNAIX_VMM_H */