feat: added ability to identify process vm regions
[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 #include <lunaix/process.h>
8
9 #define PM_PAGE_SIZE            4096
10 #define PM_BMP_MAX_SIZE        (1024 * 1024)
11
12
13 #define PP_FGPERSIST            0x1
14
15 typedef uint32_t pp_attr_t;
16
17 struct pp_struct {
18     pid_t owner;
19     uint32_t ref_counts;
20     pp_attr_t attr;
21 };
22
23 /**
24  * @brief 标注物理页为可使用
25  * 
26  * @param ppn page number
27  */
28 void pmm_mark_page_free(uintptr_t ppn);
29
30 /**
31  * @brief 标注物理页为已占用
32  * 
33  * @param ppn 
34  */
35 void pmm_mark_page_occupied(pid_t owner, uintptr_t ppn, pp_attr_t attr);
36
37 /**
38  * @brief 标注多个连续的物理页为可用
39  * 
40  * @param start_ppn 起始PPN
41  * @param page_count 数量
42  */
43 void pmm_mark_chunk_free(uintptr_t start_ppn, size_t page_count);
44
45 /**
46  * @brief 标注多个连续的物理页为已占用
47  * 
48  * @param start_ppn 起始PPN
49  * @param page_count 数量
50  */
51 void pmm_mark_chunk_occupied(pid_t owner, uintptr_t start_ppn, size_t page_count, pp_attr_t attr);
52
53 /**
54  * @brief 分配一个可用的物理页
55  * 
56  * @return void* 可用的页地址,否则为 NULL
57  */
58 void* pmm_alloc_page(pid_t owner, pp_attr_t attr);
59
60 /**
61  * @brief 分配一个连续的物理内存区域
62  * 
63  * @param owner 
64  * @param num_pages 区域大小,单位为页
65  * @param attr 
66  * @return void* 
67  */
68 void*
69 pmm_alloc_cpage(pid_t owner, size_t num_pages, pp_attr_t attr);
70
71 /**
72  * @brief 初始化物理内存管理器
73  * 
74  * @param mem_upper_lim 最大可用内存地址
75  */
76 void pmm_init(uintptr_t mem_upper_lim);
77
78 struct pp_struct* pmm_query(void* pa);
79
80 /**
81  * @brief 释放一个已分配的物理页,假若页地址不存在,则无操作。
82  * 
83  * @param page 页地址
84  * @return 是否成功
85  */
86 int pmm_free_page(pid_t owner, void* page);
87
88
89 int pmm_ref_page(pid_t owner, void* page);
90
91 #endif /* __LUNAIX_PMM_H */