A Total Overhaul on the Lunaix's Virtual Memory Model (#26)
[lunaix-os.git] / lunaix-os / includes / lunaix / mm / pmm.h
index 44aa99d7b0f2e8120b970ecc1343aedd45031320..fa22f7b89e4cdaa97487d1e7ec004852b0d539bd 100644 (file)
@@ -2,7 +2,7 @@
 #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;
 };
 
@@ -36,7 +35,7 @@ struct pp_struct
  * @param ppn page number
  */
 void
-pmm_mark_page_free(uintptr_t ppn);
+pmm_mark_page_free(ptr_t ppn);
 
 /**
  * @brief 标注物理页为已占用
@@ -44,7 +43,7 @@ pmm_mark_page_free(uintptr_t ppn);
  * @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 标注多个连续的物理页为可用
@@ -53,7 +52,7 @@ pmm_mark_page_occupied(pid_t owner, uintptr_t ppn, pp_attr_t attr);
  * @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 标注多个连续的物理页为已占用
@@ -62,8 +61,7 @@ pmm_mark_chunk_free(uintptr_t start_ppn, size_t page_count);
  * @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);
 
@@ -72,8 +70,8 @@ pmm_mark_chunk_occupied(pid_t owner,
  *
  * @return void* 可用的页地址,否则为 NULL
  */
-void*
-pmm_alloc_page(pid_t owner, pp_attr_t attr);
+ptr_t
+pmm_alloc_page(pp_attr_t attr);
 
 /**
  * @brief 分配一个连续的物理内存区域
@@ -81,10 +79,10 @@ pmm_alloc_page(pid_t owner, pp_attr_t attr);
  * @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 初始化物理内存管理器
@@ -92,21 +90,48 @@ pmm_alloc_cpage(pid_t owner, size_t num_pages, pp_attr_t attr);
  * @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 */