mm-types.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #pragma once
  2. #include <common/glib.h>
  3. #include <common/semaphore.h>
  4. #include <common/atomic.h>
  5. struct mm_struct;
  6. struct anon_vma_t;
  7. typedef uint64_t vm_flags_t;
  8. /**
  9. * @brief 内存页表结构体
  10. *
  11. */
  12. typedef struct
  13. {
  14. unsigned long pml4t;
  15. } pml4t_t;
  16. typedef struct
  17. {
  18. unsigned long pdpt;
  19. } pdpt_t;
  20. typedef struct
  21. {
  22. unsigned long pdt;
  23. } pdt_t;
  24. typedef struct
  25. {
  26. unsigned long pt;
  27. } pt_t;
  28. // Address Range Descriptor Structure 地址范围描述符
  29. struct ARDS
  30. {
  31. ul BaseAddr; // 基地址
  32. ul Length; // 内存长度 以字节为单位
  33. unsigned int type; // 本段内存的类型
  34. // type=1 表示可以被操作系统使用
  35. // type=2 ARR - 内存使用中或被保留,操作系统不能使用
  36. // 其他 未定义,操作系统需要将其视为ARR
  37. } __attribute__((packed)); // 修饰该结构体不会生成对齐空间,改用紧凑格式
  38. struct memory_desc
  39. {
  40. struct ARDS e820[32]; // 物理内存段结构数组
  41. ul len_e820; // 物理内存段长度
  42. ul *bmp; // 物理空间页映射位图
  43. ul bmp_len; // bmp的长度
  44. ul bits_size; // 物理地址空间页数量
  45. struct Page *pages_struct;
  46. ul count_pages; // struct page结构体的总数
  47. ul pages_struct_len; // pages_struct链表的长度
  48. struct Zone *zones_struct;
  49. ul count_zones; // zone结构体的数量
  50. ul zones_struct_len; // zones_struct列表的长度
  51. ul kernel_code_start, kernel_code_end; // 内核程序代码段起始地址、结束地址
  52. ul kernel_data_end, rodata_end; // 内核程序数据段结束地址、 内核程序只读段结束地址
  53. uint64_t start_brk; // 堆地址的起始位置
  54. ul end_of_struct; // 内存页管理结构的结束地址
  55. };
  56. struct Zone
  57. {
  58. // 指向内存页的指针
  59. struct Page *pages_group;
  60. ul count_pages; // 本区域的struct page结构体总数
  61. // 本内存区域的起始、结束的页对齐地址
  62. ul zone_addr_start;
  63. ul zone_addr_end;
  64. ul zone_length; // 区域长度
  65. // 本区域空间的属性
  66. ul attr;
  67. struct memory_desc *gmd_struct;
  68. // 本区域正在使用中和空闲中的物理页面数量
  69. ul count_pages_using;
  70. ul count_pages_free;
  71. // 物理页被引用次数
  72. ul total_pages_link;
  73. };
  74. struct Page
  75. {
  76. // 本页所属的内存域结构体
  77. struct Zone *zone;
  78. // 本页对应的物理地址
  79. ul addr_phys;
  80. // 页面属性
  81. ul attr;
  82. // 页面被引用的次数
  83. ul ref_counts;
  84. // 本页的创建时间
  85. ul age;
  86. struct anon_vma_t *anon_vma; // 本页对应的anon_vma
  87. spinlock_t op_lock; // 页面操作锁
  88. };
  89. /**
  90. * @brief 虚拟内存区域(VMA)结构体
  91. *
  92. */
  93. struct vm_area_struct
  94. {
  95. struct vm_area_struct *vm_prev, *vm_next;
  96. // 虚拟内存区域的范围是一个左闭右开的区间:[vm_start, vm_end)
  97. uint64_t vm_start; // 区域的起始地址
  98. uint64_t vm_end; // 区域的结束地址
  99. struct mm_struct *vm_mm; // 虚拟内存区域对应的mm结构体
  100. vm_flags_t vm_flags; // 虚拟内存区域的标志位, 具体可选值请见mm.h
  101. struct List anon_vma_list; // anon_vma的链表结点
  102. struct anon_vma_t * anon_vma; // 属于的anon_vma
  103. struct vm_operations_t *vm_ops; // 操作方法
  104. atomic_t ref_count; // 引用计数
  105. void *private_data;
  106. };
  107. /**
  108. * @brief 内存空间分布结构体
  109. * 包含了进程内存空间分布的信息
  110. */
  111. struct mm_struct
  112. {
  113. pml4t_t *pgd; // 内存页表指针
  114. struct vm_area_struct *vmas; // VMA列表
  115. // 代码段空间
  116. uint64_t code_addr_start, code_addr_end;
  117. // 数据段空间
  118. uint64_t data_addr_start, data_addr_end;
  119. // 只读数据段空间
  120. uint64_t rodata_addr_start, rodata_addr_end;
  121. // BSS段的空间
  122. uint64_t bss_start, bss_end;
  123. // 动态内存分配区(堆区域)
  124. uint64_t brk_start, brk_end;
  125. // 应用层栈基地址
  126. uint64_t stack_start;
  127. };
  128. /**
  129. * @brief 匿名vma对象的结构体
  130. *
  131. * anon_vma与每个内存页结构体进行一对一绑定
  132. * anon_vma也连接着一切使用到该内存页的vma,当发生页面换出时,应当更新与该page相关的所有vma在页表中的映射信息。
  133. */
  134. struct anon_vma_t
  135. {
  136. semaphore_t sem;
  137. atomic_t ref_count;
  138. // todo: 把下面的循环链表更换成红黑树
  139. // 与当前anon_vma相关的vma的列表
  140. struct List vma_list;
  141. };