X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/cd09c4b222e4ddf45a42522563ae2471a829d1c8..d07db7c15d6cf9d6c0fd07ea29cca77a89b02a79:/lunaix-os/includes/lunaix/mm/vmm.h diff --git a/lunaix-os/includes/lunaix/mm/vmm.h b/lunaix-os/includes/lunaix/mm/vmm.h index 14b3a7f..752f23c 100644 --- a/lunaix-os/includes/lunaix/mm/vmm.h +++ b/lunaix-os/includes/lunaix/mm/vmm.h @@ -1,60 +1,96 @@ #ifndef __LUNAIX_VMM_H #define __LUNAIX_VMM_H -#include -#include #include +#include +#include // Virtual memory manager /** * @brief 初始化虚拟内存管理器 - * + * */ -void vmm_init(); +void +vmm_init(); /** * @brief 创建一个页目录 - * + * * @return ptd_entry* 页目录的物理地址,随时可以加载进CR3 */ -ptd_t* vmm_init_pd(); +x86_page_table* +vmm_init_pd(); /** - * @brief - * 尝试建立一个映射关系。映射指定的物理页地址至虚拟页地址,如果指定的虚拟页地址已被占用 + * @brief 尝试建立一个映射关系。映射指定的物理页地址至虚拟页地址,如果指定的虚拟页地址已被占用 * 则尝试寻找新的可用地址(改地址总是大于指定的地址)。 - * + * * @param vpn 虚拟页地址 - * @param ppn 物理页地址 + * @param pa 物理页地址 * @param dattr PDE 的属性 * @param tattr PTE 的属性 * @return 虚拟页地址,如不成功,则为 NULL */ -void* vmm_map_page(void* vpn, void* ppn, pt_attr dattr, pt_attr tattr); +void* +vmm_map_page(void* va, void* pa, pt_attr tattr); + +/** + * @brief 建立一个映射关系,映射指定的物理页地址至虚拟页地址。如果指定的虚拟页地址已被占用, + * 则覆盖。 + * + * @param va 虚拟页地址 + * @param pa 物理页地址 + * @param dattr PDE 的属性 + * @param tattr PTE 的属性 + * @return 虚拟页地址 + */ +void* +vmm_fmap_page(void* va, void* pa, pt_attr tattr); /** * @brief 尝试为一个虚拟页地址创建一个可用的物理页映射 - * - * @param vpn 虚拟页地址 + * + * @param va 虚拟页地址 * @return 物理页地址,如不成功,则为 NULL */ -void* vmm_alloc_page(void* vpn, pt_attr dattr, pt_attr tattr); +void* +vmm_alloc_page(void* va, pt_attr tattr); + /** - * @brief 删除一个映射 + * @brief 尝试分配多个连续的虚拟页 * - * @param vpn + * @param va 起始虚拟地址 + * @param sz 大小(必须为4K对齐) + * @param tattr 属性 + * @return int 是否成功 */ -void vmm_unmap_page(void* vpn); +int +vmm_alloc_pages(void* va, size_t sz, pt_attr tattr); -ptd_t* get_pd(); -void set_pd(ptd_t* pd); +/** + * @brief 删除一个映射 + * + * @param vpn + */ +void +vmm_unmap_page(void* va); /** * @brief 将虚拟地址翻译为其对应的物理映射 - * + * * @param va 虚拟地址 * @return void* 物理地址,如映射不存在,则为NULL */ -void* vmm_v2p(void* va); +void* +vmm_v2p(void* va); + +/** + * @brief 查找一个映射 + * + * @param va 虚拟地址 + * @return v_mapping 映射相关属性 + */ +v_mapping +vmm_lookup(void* va); #endif /* __LUNAIX_VMM_H */