3 // Physical memory manager
7 #include <lunaix/process.h>
9 #define PM_PAGE_SIZE 4096
10 #define PM_BMP_MAX_SIZE (1024 * 1024)
13 #define PP_FGPERSIST 0x1
15 typedef uint32_t pp_attr_t;
26 * @param ppn page number
28 void pmm_mark_page_free(uintptr_t ppn);
35 void pmm_mark_page_occupied(pid_t owner, uintptr_t ppn, pp_attr_t attr);
38 * @brief 标注多个连续的物理页为可用
40 * @param start_ppn 起始PPN
41 * @param page_count 数量
43 void pmm_mark_chunk_free(uintptr_t start_ppn, size_t page_count);
46 * @brief 标注多个连续的物理页为已占用
48 * @param start_ppn 起始PPN
49 * @param page_count 数量
51 void pmm_mark_chunk_occupied(pid_t owner, uintptr_t start_ppn, size_t page_count, pp_attr_t attr);
56 * @return void* 可用的页地址,否则为 NULL
58 void* pmm_alloc_page(pid_t owner, pp_attr_t attr);
61 * @brief 分配一个连续的物理内存区域
64 * @param num_pages 区域大小,单位为页
69 pmm_alloc_cpage(pid_t owner, size_t num_pages, pp_attr_t attr);
74 * @param mem_upper_lim 最大可用内存地址
76 void pmm_init(uintptr_t mem_upper_lim);
78 struct pp_struct* pmm_query(void* pa);
81 * @brief 释放一个已分配的物理页,假若页地址不存在,则无操作。
86 int pmm_free_page(pid_t owner, void* page);
89 int pmm_ref_page(pid_t owner, void* page);
91 #endif /* __LUNAIX_PMM_H */