X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/1fe5f5eb5378a47bf0f3451762743c162e40faad..965940833071025bf0d386f4a9c70a5258453dbd:/lunaix-os/includes/lunaix/mm/vmm.h?ds=sidebyside diff --git a/lunaix-os/includes/lunaix/mm/vmm.h b/lunaix-os/includes/lunaix/mm/vmm.h index 3f102db..74cba52 100644 --- a/lunaix-os/includes/lunaix/mm/vmm.h +++ b/lunaix-os/includes/lunaix/mm/vmm.h @@ -2,8 +2,7 @@ #define __LUNAIX_VMM_H #include #include -#include -#include +#include // Virtual memory manager #define VMAP_NULL 0 @@ -20,6 +19,12 @@ */ #define VMAP_NOMAP 2 +/** + * @brief 映射页墙:将虚拟地址映射为页墙,忽略给定的物理地址和页属性 + * + */ +#define VMAP_GUARDPAGE 4 + /** * @brief 规定下一个可用页映射应当限定在指定的4MB地址空间内 * @@ -91,10 +96,7 @@ vmm_lookupat(ptr_t mnt, ptr_t va, v_mapping* mapping); * */ ptr_t -vmm_dup_page(pid_t pid, ptr_t pa); - -ptr_t -vmm_dup_vmspace(pid_t pid); +vmm_dup_page(ptr_t pa); /** * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间 @@ -112,22 +114,25 @@ vmm_mount_pd(ptr_t mnt, ptr_t pde); ptr_t vmm_unmount_pd(ptr_t mnt); +static inline ptr_t +vmm_mount_pg(ptr_t mnt, ptr_t pa) { + assert(pa); + vmm_set_mapping(VMS_SELF, mnt, pa, PG_PREM_RW, 0); + return mnt; +} + +static inline ptr_t +vmm_unmount_pg(ptr_t mnt) { + vmm_del_mapping(VMS_SELF, mnt); + return mnt; +} + void* vmm_ioremap(ptr_t paddr, size_t size); void* vmm_next_free(ptr_t start, int options); -/** - * @brief 将连续的物理地址空间映射到内核虚拟地址空间 - * - * @param paddr 物理地址空间的基地址 - * @param size 物理地址空间的大小 - * @return void* - */ -void* -vmm_vmap(ptr_t paddr, size_t size, pt_attr attr); - /** * @brief 将当前地址空间的虚拟地址转译为物理地址。 * @@ -147,4 +152,54 @@ vmm_v2p(ptr_t va); ptr_t vmm_v2pat(ptr_t mnt, ptr_t va); +/* + 表示一个 vmap 区域 + (One must not get confused with vmap_area in Linux!) +*/ +struct vmap_area +{ + ptr_t start; + size_t size; + pt_attr area_attr; +}; + +/** + * @brief 将连续的物理地址空间映射到内核虚拟地址空间 + * + * @param paddr 物理地址空间的基地址 + * @param size 物理地址空间的大小 + * @return void* + */ +void* +vmap(ptr_t paddr, size_t size, pt_attr attr, int flags); + +/** + * @brief 创建一个 vmap 区域 + * + * @param paddr + * @param attr + * @return ptr_t + */ +struct vmap_area* +vmap_varea(size_t size, pt_attr attr); + +/** + * @brief 在 vmap区域内映射一个单页 + * + * @param paddr + * @param attr + * @return ptr_t + */ +ptr_t +vmap_area_page(struct vmap_area* area, ptr_t paddr, pt_attr attr); + +/** + * @brief 在 vmap区域删除一个已映射的页 + * + * @param paddr + * @return ptr_t + */ +ptr_t +vmap_area_rmpage(struct vmap_area* area, ptr_t vaddr); + #endif /* __LUNAIX_VMM_H */