1 #pragma once 2 3 #include "mm.h" 4 5 6 // 当vma被成功合并后的返回值 7 #define __VMA_MERGED 1 8 9 /** 10 * @brief 将vma结构体插入mm_struct的链表之中 11 * 12 * @param mm 内存空间分布结构体 13 * @param vma 待插入的VMA结构体 14 * @param prev 链表的前一个结点 15 */ 16 void __vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma, struct vm_area_struct *prev); 17 18 /** 19 * @brief 将vma给定结构体从vma链表的结点之中删除 20 * 21 * @param mm 内存空间分布结构体 22 * @param vma 待插入的VMA结构体 23 */ 24 void __vma_unlink_list(struct mm_struct *mm, struct vm_area_struct *vma); 25 26 /** 27 * @brief 获取指定虚拟地址处映射的物理地址 28 * 29 * @param mm 内存空间分布结构体 30 * @param vaddr 虚拟地址 31 * @return uint64_t 已映射的物理地址 32 */ 33 uint64_t __mm_get_paddr(struct mm_struct *mm, uint64_t vaddr); 34 35 /** 36 * @brief 创建anon_vma,并将其与页面结构体进行绑定 37 * 若提供的页面结构体指针为NULL,则只创建,不绑定 38 * 39 * @param page 页面结构体的指针 40 * @param lock_page 是否将页面结构体加锁 41 * @return struct anon_vma_t* 创建好的anon_vma 42 */ 43 struct anon_vma_t *__anon_vma_create_alloc(struct Page *page, bool lock_page); 44 45 /** 46 * @brief 释放anon vma结构体 47 * 48 * @param anon_vma 待释放的anon_vma结构体 49 * @return int 返回码 50 */ 51 int __anon_vma_free(struct anon_vma_t *anon_vma); 52 53 /** 54 * @brief 将指定的vma加入到anon_vma的管理范围之中 55 * 56 * @param anon_vma 页面的anon_vma 57 * @param vma 待加入的vma 58 * @return int 返回码 59 */ 60 int __anon_vma_add(struct anon_vma_t *anon_vma, struct vm_area_struct *vma); 61 62 /** 63 * @brief 从anon_vma的管理范围中删除指定的vma 64 * (在进入这个函数之前,应该要对anon_vma加锁) 65 * @param vma 将要取消对应的anon_vma管理的vma结构体 66 * @return int 返回码 67 */ 68 int __anon_vma_del(struct vm_area_struct *vma); 69 70 /** 71 * @brief 创建mmio对应的页结构体 72 * 73 * @param paddr 物理地址 74 * @return struct Page* 创建成功的page 75 */ 76 struct Page* __create_mmio_page_struct(uint64_t paddr); 77 78 // 判断给定的两个值是否跨越了2M边界 79 #define CROSS_2M_BOUND(val1, val2) ((val1 & PAGE_2M_MASK) != (val2 & PAGE_2M_MASK))