internal.h 2.2 KB

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