X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/f552823ca5288f68128995ed503d0cb0f974d455..48b4a227035048fdebcd32532deb7a857c6199ac:/lunaix-os/includes/lunaix/mm/pmm.h diff --git a/lunaix-os/includes/lunaix/mm/pmm.h b/lunaix-os/includes/lunaix/mm/pmm.h index 36396df..d45af82 100644 --- a/lunaix-os/includes/lunaix/mm/pmm.h +++ b/lunaix-os/includes/lunaix/mm/pmm.h @@ -4,9 +4,21 @@ #include #include +#include #define PM_PAGE_SIZE 4096 -#define PM_BMP_MAX_SIZE (128 * 1024) +#define PM_BMP_MAX_SIZE (1024 * 1024) + + +#define PP_FGPERSIST 0x1 + +typedef uint32_t pp_attr_t; + +struct pp_struct { + pid_t owner; + uint32_t ref_counts; + pp_attr_t attr; +}; /** * @brief 标注物理页为可使用 @@ -20,7 +32,7 @@ void pmm_mark_page_free(uintptr_t ppn); * * @param ppn */ -void pmm_mark_page_occupied(uintptr_t ppn); +void pmm_mark_page_occupied(pid_t owner, uintptr_t ppn, pp_attr_t attr); /** * @brief 标注多个连续的物理页为可用 @@ -36,14 +48,25 @@ void pmm_mark_chunk_free(uintptr_t start_ppn, size_t page_count); * @param start_ppn 起始PPN * @param page_count 数量 */ -void pmm_mark_chunk_occupied(uintptr_t start_ppn, size_t page_count); +void pmm_mark_chunk_occupied(pid_t owner, uintptr_t start_ppn, size_t page_count, pp_attr_t attr); /** * @brief 分配一个可用的物理页 * * @return void* 可用的页地址,否则为 NULL */ -void* pmm_alloc_page(); +void* pmm_alloc_page(pid_t owner, pp_attr_t attr); + +/** + * @brief 分配一个连续的物理内存区域 + * + * @param owner + * @param num_pages 区域大小,单位为页 + * @param attr + * @return void* + */ +void* +pmm_alloc_cpage(pid_t owner, size_t num_pages, pp_attr_t attr); /** * @brief 初始化物理内存管理器 @@ -52,6 +75,7 @@ void* pmm_alloc_page(); */ void pmm_init(uintptr_t mem_upper_lim); +struct pp_struct* pmm_query(void* pa); /** * @brief 释放一个已分配的物理页,假若页地址不存在,则无操作。 @@ -59,7 +83,9 @@ void pmm_init(uintptr_t mem_upper_lim); * @param page 页地址 * @return 是否成功 */ -int pmm_free_page(void* page); +int pmm_free_page(pid_t owner, void* page); + +int pmm_ref_page(pid_t owner, void* page); #endif /* __LUNAIX_PMM_H */