Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[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/types.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     u32_t ref_counts;
29     pp_attr_t attr;
30 };
31
32 /**
33  * @brief 标注物理页为可使用
34  *
35  * @param ppn page number
36  */
37 void
38 pmm_mark_page_free(ptr_t ppn);
39
40 /**
41  * @brief 标注物理页为已占用
42  *
43  * @param ppn
44  */
45 void
46 pmm_mark_page_occupied(ptr_t ppn, pp_attr_t attr);
47
48 /**
49  * @brief 标注多个连续的物理页为可用
50  *
51  * @param start_ppn 起始PPN
52  * @param page_count 数量
53  */
54 void
55 pmm_mark_chunk_free(ptr_t start_ppn, size_t page_count);
56
57 /**
58  * @brief 标注多个连续的物理页为已占用
59  *
60  * @param start_ppn 起始PPN
61  * @param page_count 数量
62  */
63 void
64 pmm_mark_chunk_occupied(u32_t start_ppn,
65                         size_t page_count,
66                         pp_attr_t attr);
67
68 /**
69  * @brief 分配一个可用的物理页
70  *
71  * @return void* 可用的页地址,否则为 NULL
72  */
73 ptr_t
74 pmm_alloc_page(pp_attr_t attr);
75
76 /**
77  * @brief 分配一个连续的物理内存区域
78  *
79  * @param owner
80  * @param num_pages 区域大小,单位为页
81  * @param attr
82  * @return ptr_t
83  */
84 ptr_t
85 pmm_alloc_cpage(size_t num_pages, pp_attr_t attr);
86
87 /**
88  * @brief 初始化物理内存管理器
89  *
90  * @param mem_upper_lim 最大可用内存地址
91  */
92 void
93 pmm_init(ptr_t mem_upper_lim);
94
95 struct pp_struct*
96 pmm_query(ptr_t pa);
97
98 /**
99  * @brief 释放一个已分配的物理页,假若页地址不存在,则无操作。
100  *
101  * @param page 页地址
102  * @return 是否成功
103  */
104 int
105 pmm_free_page(ptr_t page);
106
107 int
108 pmm_ref_page(ptr_t page);
109
110 #endif /* __LUNAIX_PMM_H */