mmio-buddy.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #pragma once
  2. #include <common/sys/types.h>
  3. #include <common/glib.h>
  4. #include "mm-types.h"
  5. #include "mm.h"
  6. #include "slab.h"
  7. #define MMIO_BUDDY_MAX_EXP PAGE_1G_SHIFT
  8. #define MMIO_BUDDY_MIN_EXP PAGE_4K_SHIFT
  9. #define MMIO_BUDDY_REGION_COUNT (MMIO_BUDDY_MAX_EXP - MMIO_BUDDY_MIN_EXP + 1)
  10. /**
  11. * @brief mmio伙伴系统内部的地址区域结构体
  12. *
  13. */
  14. struct __mmio_buddy_addr_region
  15. {
  16. struct List list;
  17. uint64_t vaddr; // 该内存对象起始位置的虚拟地址
  18. };
  19. /**
  20. * @brief 空闲页数组结构体
  21. *
  22. */
  23. struct __mmio_free_region_list
  24. {
  25. struct List list_head;
  26. int64_t num_free; // 空闲页的数量
  27. };
  28. /**
  29. * @brief buddy内存池
  30. *
  31. */
  32. struct mmio_buddy_mem_pool
  33. {
  34. uint64_t pool_start_addr; // 内存池的起始地址
  35. uint64_t pool_size; // 内存池的内存空间总大小
  36. spinlock_t op_lock; // 操作锁
  37. /**
  38. * @brief 空闲地址区域链表
  39. * 数组的第i个元素代表大小为2^(i+12)的内存区域
  40. */
  41. struct __mmio_free_region_list free_regions[MMIO_BUDDY_REGION_COUNT];
  42. };
  43. /**
  44. * @brief 释放address region结构体
  45. *
  46. * @param region 待释放的结构体
  47. */
  48. static __always_inline void __mmio_buddy_release_addr_region(struct __mmio_buddy_addr_region *region)
  49. {
  50. kfree(region);
  51. }
  52. /**
  53. * @brief 归还一块内存空间到buddy
  54. *
  55. * @param vaddr 虚拟地址
  56. * @param exp 内存空间的大小(2^exp)
  57. * @return int 返回码
  58. */
  59. int __mmio_buddy_give_back(uint64_t vaddr, int exp);
  60. /**
  61. * @brief 初始化mmio的伙伴系统
  62. *
  63. */
  64. void mmio_buddy_init();
  65. /**
  66. * @brief 从buddy中申请一块指定大小的内存区域
  67. *
  68. * @param exp 内存区域的大小(2^exp)
  69. * @return struct __mmio_buddy_addr_region* 符合要求的内存区域。没有满足要求的时候,返回NULL
  70. */
  71. struct __mmio_buddy_addr_region *mmio_buddy_query_addr_region(int exp);