mm-types.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. /**
  26. * @brief 虚拟内存区域(VMA)结构体
  27. *
  28. */
  29. struct vm_area_struct
  30. {
  31. struct vm_area_struct *vm_prev, *vm_next;
  32. // 虚拟内存区域的范围是一个左闭右开的区间:[vm_start, vm_end)
  33. uint64_t vm_start; // 区域的起始地址
  34. uint64_t vm_end; // 区域的结束地址
  35. struct mm_struct *vm_mm; // 虚拟内存区域对应的mm结构体
  36. vm_flags_t vm_flags; // 虚拟内存区域的标志位, 具体可选值请见mm.h
  37. struct vm_operations_t *vm_ops; // 操作方法
  38. uint64_t ref_count; // 引用计数
  39. void *private_data;
  40. };
  41. /**
  42. * @brief 内存空间分布结构体
  43. * 包含了进程内存空间分布的信息
  44. */
  45. struct mm_struct
  46. {
  47. pml4t_t *pgd; // 内存页表指针
  48. struct vm_area_struct *vmas; // VMA列表
  49. // 代码段空间
  50. uint64_t code_addr_start, code_addr_end;
  51. // 数据段空间
  52. uint64_t data_addr_start, data_addr_end;
  53. // 只读数据段空间
  54. uint64_t rodata_addr_start, rodata_addr_end;
  55. // BSS段的空间
  56. uint64_t bss_start, bss_end;
  57. // 动态内存分配区(堆区域)
  58. uint64_t brk_start, brk_end;
  59. // 应用层栈基地址
  60. uint64_t stack_start;
  61. };