A Total Overhaul on the Lunaix's Virtual Memory Model (#26)
[lunaix-os.git] / lunaix-os / includes / lunaix / mm / pmm.h
index e0eab12e449391d6acc8e47de4a19dd3f27cbc56..fa22f7b89e4cdaa97487d1e7ec004852b0d539bd 100644 (file)
  * @brief 长久页:不会被缓存,但允许释放
  *
  */
  * @brief 长久页:不会被缓存,但允许释放
  *
  */
-#define PP_FGPERSIST 0x1
+#define PP_FGPERSIST    0b00001
 
 /**
  * @brief 锁定页:不会被缓存,不能被释放
  *
  */
 
 /**
  * @brief 锁定页:不会被缓存,不能被释放
  *
  */
-#define PP_FGLOCKED 0x2
+#define PP_FGLOCKED     0b00011
 
 typedef u32_t pp_attr_t;
 
 struct pp_struct
 {
 
 typedef u32_t pp_attr_t;
 
 struct pp_struct
 {
-    pid_t owner;
     u32_t ref_counts;
     pp_attr_t attr;
 };
     u32_t ref_counts;
     pp_attr_t attr;
 };
@@ -44,7 +43,7 @@ pmm_mark_page_free(ptr_t ppn);
  * @param ppn
  */
 void
  * @param ppn
  */
 void
-pmm_mark_page_occupied(pid_t owner, ptr_t ppn, pp_attr_t attr);
+pmm_mark_page_occupied(ptr_t ppn, pp_attr_t attr);
 
 /**
  * @brief 标注多个连续的物理页为可用
 
 /**
  * @brief 标注多个连续的物理页为可用
@@ -62,8 +61,7 @@ pmm_mark_chunk_free(ptr_t start_ppn, size_t page_count);
  * @param page_count 数量
  */
 void
  * @param page_count 数量
  */
 void
-pmm_mark_chunk_occupied(pid_t owner,
-                        u32_t start_ppn,
+pmm_mark_chunk_occupied(u32_t start_ppn,
                         size_t page_count,
                         pp_attr_t attr);
 
                         size_t page_count,
                         pp_attr_t attr);
 
@@ -73,7 +71,7 @@ pmm_mark_chunk_occupied(pid_t owner,
  * @return void* 可用的页地址,否则为 NULL
  */
 ptr_t
  * @return void* 可用的页地址,否则为 NULL
  */
 ptr_t
-pmm_alloc_page(pid_t owner, pp_attr_t attr);
+pmm_alloc_page(pp_attr_t attr);
 
 /**
  * @brief 分配一个连续的物理内存区域
 
 /**
  * @brief 分配一个连续的物理内存区域
@@ -84,7 +82,7 @@ pmm_alloc_page(pid_t owner, pp_attr_t attr);
  * @return ptr_t
  */
 ptr_t
  * @return ptr_t
  */
 ptr_t
-pmm_alloc_cpage(pid_t owner, size_t num_pages, pp_attr_t attr);
+pmm_alloc_cpage(size_t num_pages, pp_attr_t attr);
 
 /**
  * @brief 初始化物理内存管理器
 
 /**
  * @brief 初始化物理内存管理器
@@ -98,15 +96,42 @@ struct pp_struct*
 pmm_query(ptr_t 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 是否成功
  */
  *
  * @param page 页地址
  * @return 是否成功
  */
-int
-pmm_free_page(pid_t owner, ptr_t 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
 
 int
-pmm_ref_page(pid_t owner, ptr_t page);
+pmm_ref_page(ptr_t page);
+
+void
+pmm_set_attr(ptr_t page, pp_attr_t attr);
 
 #endif /* __LUNAIX_PMM_H */
 
 #endif /* __LUNAIX_PMM_H */