mmio-buddy.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #pragma once
  2. #include <common/sys/types.h>
  3. #include <common/glib.h>
  4. #include "mm-types.h"
  5. #include "mm.h"
  6. #define MMIO_BUDDY_MAX_EXP PAGE_1G_SHIFT
  7. #define MMIO_BUDDY_MIN_EXP PAGE_4K_SHIFT
  8. #define MMIO_BUDDY_REGION_COUNT (MMIO_BUDDY_MAX_EXP - MMIO_BUDDY_MIN_EXP + 1)
  9. /**
  10. * @brief mmio伙伴系统内部的地址区域结构体
  11. *
  12. */
  13. struct __mmio_buddy_addr_region
  14. {
  15. struct List list;
  16. uint64_t vaddr; // 该内存对象起始位置的虚拟地址
  17. };
  18. /**
  19. * @brief 空闲页数组结构体
  20. *
  21. */
  22. struct __mmio_free_region_list
  23. {
  24. struct List list_head;
  25. int64_t num_free; // 空闲页的数量
  26. };
  27. /**
  28. * @brief buddy内存池
  29. *
  30. */
  31. struct mmio_buddy_mem_pool
  32. {
  33. uint64_t pool_start_addr; // 内存池的起始地址
  34. uint64_t pool_size; // 内存池的内存空间总大小
  35. spinlock_t op_lock; // 操作锁
  36. /**
  37. * @brief 空闲地址区域链表
  38. * 数组的第i个元素代表大小为2^(i+12)的内存区域
  39. */
  40. struct __mmio_free_region_list free_regions[MMIO_BUDDY_REGION_COUNT];
  41. };
  42. /**
  43. * @brief 初始化mmio的伙伴系统
  44. *
  45. */
  46. void mmio_buddy_init();