Virtual memory & paging
[lunaix-os.git] / lunaix-os / includes / lunaix / mm / pmm.h
1 #ifndef __LUNAIX_PMM_H
2 #define __LUNAIX_PMM_H
3 // Physical memory manager
4
5 #include <stdint.h>
6 #include <stddef.h>
7
8 #define PM_PAGE_SIZE            4096
9 #define PM_BMP_MAX_SIZE        (128 * 1024)
10
11 /**
12  * @brief 标注物理页为可使用
13  * 
14  * @param ppn page number
15  */
16 void pmm_mark_page_free(uintptr_t ppn);
17
18 /**
19  * @brief 标注物理页为已占用
20  * 
21  * @param ppn 
22  */
23 void pmm_mark_page_occupied(uintptr_t ppn);
24
25 /**
26  * @brief 标注多个连续的物理页为可用
27  * 
28  * @param start_ppn 起始PPN
29  * @param page_count 数量
30  */
31 void pmm_mark_chunk_free(uintptr_t start_ppn, size_t page_count);
32
33 /**
34  * @brief 标注多个连续的物理页为已占用
35  * 
36  * @param start_ppn 起始PPN
37  * @param page_count 数量
38  */
39 void pmm_mark_chunk_occupied(uintptr_t start_ppn, size_t page_count);
40
41 /**
42  * @brief 分配一个可用的物理页
43  * 
44  * @return void* 可用的页地址,否则为 NULL
45  */
46 void* pmm_alloc_page();
47
48 /**
49  * @brief 初始化物理内存管理器
50  * 
51  * @param mem_upper_lim 最大可用内存地址
52  */
53 void pmm_init(uintptr_t mem_upper_lim);
54
55
56 /**
57  * @brief 释放一个已分配的物理页,假若页地址不存在,则无操作。
58  * 
59  * @param page 页地址
60  * @return 是否成功
61  */
62 int pmm_free_page(void* page);
63
64
65 #endif /* __LUNAIX_PMM_H */