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