mm-types.h 3.8 KB

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