#define __LUNAIX_PMM_H
// Physical memory manager
-#include <lunaix/process.h>
+#include <lunaix/types.h>
#include <stddef.h>
#include <stdint.h>
* @brief 长久页:不会被缓存,但允许释放
*
*/
-#define PP_FGPERSIST 0x1
+#define PP_FGPERSIST 0b00001
/**
* @brief 锁定页:不会被缓存,不能被释放
*
*/
-#define PP_FGLOCKED 0x2
+#define PP_FGLOCKED 0b00011
-typedef uint32_t pp_attr_t;
+typedef u32_t pp_attr_t;
struct pp_struct
{
- pid_t owner;
- uint32_t ref_counts;
+ u32_t ref_counts;
pp_attr_t attr;
};
* @param ppn page number
*/
void
-pmm_mark_page_free(uintptr_t ppn);
+pmm_mark_page_free(ptr_t ppn);
/**
* @brief 标注物理页为已占用
* @param ppn
*/
void
-pmm_mark_page_occupied(pid_t owner, uintptr_t ppn, pp_attr_t attr);
+pmm_mark_page_occupied(ptr_t ppn, pp_attr_t attr);
/**
* @brief 标注多个连续的物理页为可用
* @param page_count 数量
*/
void
-pmm_mark_chunk_free(uintptr_t start_ppn, size_t page_count);
+pmm_mark_chunk_free(ptr_t start_ppn, size_t page_count);
/**
* @brief 标注多个连续的物理页为已占用
* @param page_count 数量
*/
void
-pmm_mark_chunk_occupied(pid_t owner,
- uintptr_t start_ppn,
+pmm_mark_chunk_occupied(u32_t start_ppn,
size_t page_count,
pp_attr_t attr);
*
* @return void* 可用的页地址,否则为 NULL
*/
-void*
-pmm_alloc_page(pid_t owner, pp_attr_t attr);
+ptr_t
+pmm_alloc_page(pp_attr_t attr);
/**
* @brief 分配一个连续的物理内存区域
* @param owner
* @param num_pages 区域大小,单位为页
* @param attr
- * @return void*
+ * @return ptr_t
*/
-void*
-pmm_alloc_cpage(pid_t owner, size_t num_pages, pp_attr_t attr);
+ptr_t
+pmm_alloc_cpage(size_t num_pages, pp_attr_t attr);
/**
* @brief 初始化物理内存管理器
* @param mem_upper_lim 最大可用内存地址
*/
void
-pmm_init(uintptr_t mem_upper_lim);
+pmm_init(ptr_t mem_upper_lim);
struct pp_struct*
-pmm_query(void* pa);
+pmm_query(ptr_t pa);
/**
- * @brief 释放一个已分配的物理页,假若页地址不存在,则无操作。
+ * @brief Free physical page with given attributes
+ *
+ * @param page
+ * @return int
+ */
+int
+pmm_free_one(ptr_t page, pp_attr_t attr_mask);
+
+/**
+ * @brief Free a normal physical page
*
* @param page 页地址
* @return 是否成功
*/
-int
-pmm_free_page(pid_t owner, void* page);
+static inline int
+pmm_free_page(ptr_t page)
+{
+ return pmm_free_one(page, 0);
+}
+
+/**
+ * @brief Free physical page regardless of it's attribute
+ *
+ * @param page
+ * @return int
+ */
+static inline int
+pmm_free_any(ptr_t page)
+{
+ return pmm_free_one(page, -1);
+}
int
-pmm_ref_page(pid_t owner, void* page);
+pmm_ref_page(ptr_t page);
+
+void
+pmm_set_attr(ptr_t page, pp_attr_t attr);
#endif /* __LUNAIX_PMM_H */