#ifndef __LUNAIX_VMM_H
#define __LUNAIX_VMM_H
#include <lunaix/mm/page.h>
+#include <lunaix/process.h>
#include <stddef.h>
#include <stdint.h>
+#include <lunaix/mm/pmm.h>
// Virtual memory manager
/**
/**
* @brief 尝试建立一个映射关系。映射指定的物理页地址至虚拟页地址,如果指定的虚拟页地址已被占用
- * 则尝试寻找新的可用地址(改地址总是大于指定的地址)。
+ * 则尝试寻找新的可用地址(该地址总是大于指定的地址)。
*
* @param vpn 虚拟页地址
* @param pa 物理页地址
* @return 虚拟页地址,如不成功,则为 NULL
*/
void*
-vmm_map_page(void* va, void* pa, pt_attr tattr);
+vmm_map_page(pid_t pid, void* va, void* pa, pt_attr tattr);
/**
* @brief 建立一个映射关系,映射指定的物理页地址至虚拟页地址。如果指定的虚拟页地址已被占用,
* @return 虚拟页地址
*/
void*
-vmm_fmap_page(void* va, void* pa, pt_attr tattr);
+vmm_fmap_page(pid_t pid, void* va, void* pa, pt_attr tattr);
/**
* @brief 尝试为一个虚拟页地址创建一个可用的物理页映射
*
* @param va 虚拟页地址
- * @return 物理页地址,如不成功,则为 NULL
+ * @return 虚拟页地址,如不成功,则为 NULL
*/
void*
-vmm_alloc_page(void* va, pt_attr tattr);
+vmm_alloc_page(pid_t pid, void* va, void** pa, pt_attr tattr, pp_attr_t pattr);
/**
* @return int 是否成功
*/
int
-vmm_alloc_pages(void* va, size_t sz, pt_attr tattr);
+vmm_alloc_pages(pid_t pid, void* va, size_t sz, pt_attr tattr, pp_attr_t pattr);
+
+/**
+ * @brief 设置一个映射,如果映射已存在,则忽略。
+ *
+ * @param va
+ * @param pa
+ * @param attr
+ */
+int
+vmm_set_mapping(pid_t pid, void* va, void* pa, pt_attr attr);
+
+/**
+ * @brief 删除并释放一个映射
+ *
+ * @param vpn
+ */
+void
+vmm_unmap_page(pid_t pid, void* va);
/**
* @brief 删除一个映射
* @param vpn
*/
void
-vmm_unmap_page(void* va);
+vmm_unset_mapping(void* va);
/**
* @brief 将虚拟地址翻译为其对应的物理映射
v_mapping
vmm_lookup(void* va);
+/**
+ * @brief (COW) 为虚拟页创建副本。
+ *
+ * @return void* 包含虚拟页副本的物理页地址。
+ *
+ */
+void* vmm_dup_page(void* va);
+
#endif /* __LUNAIX_VMM_H */