feat: No more kernel page table switching upon interrupt.
[lunaix-os.git] / lunaix-os / includes / lunaix / mm / pmm.h
index 36396dfcaed049055ad4ee6a2ca71d5060c4c3eb..d45af82653481d13ed7247ea1f91b0e2193b86f3 100644 (file)
@@ -4,9 +4,21 @@
 
 #include <stdint.h>
 #include <stddef.h>
+#include <lunaix/process.h>
 
 #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 */