slab.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #pragma once
  2. #include "mm.h"
  3. #include <common/glib.h>
  4. #include <common/printk.h>
  5. #include <common/kprint.h>
  6. #include <common/spinlock.h>
  7. #define SIZEOF_LONG_ALIGN(size) ((size + sizeof(long) - 1) & ~(sizeof(long) - 1))
  8. #define SIZEOF_INT_ALIGN(size) ((size + sizeof(int) - 1) & ~(sizeof(int) - 1))
  9. // SLAB存储池count_using不为空
  10. #define ESLAB_NOTNULL 101
  11. #define ENOT_IN_SLAB 102 // 地址不在当前slab内存池中
  12. #define ECANNOT_FREE_MEM 103 // 无法释放内存
  13. struct slab_obj
  14. {
  15. struct List list;
  16. // 当前slab对象所使用的内存页
  17. struct Page *page;
  18. ul count_using;
  19. ul count_free;
  20. // 当前页面所在的线性地址
  21. void *vaddr;
  22. // 位图
  23. ul bmp_len; // 位图的长度(字节)
  24. ul bmp_count; // 位图的有效位数
  25. ul *bmp;
  26. };
  27. // slab内存池
  28. struct slab
  29. {
  30. ul size; // 单位:byte
  31. ul count_total_using;
  32. ul count_total_free;
  33. // 内存池对象
  34. struct slab_obj *cache_pool_entry;
  35. // dma内存池对象
  36. struct slab_obj *cache_dma_pool_entry;
  37. spinlock_t lock; // 当前内存池的操作锁
  38. // 内存池的构造函数和析构函数
  39. void *(*constructor)(void *vaddr, ul arg);
  40. void *(*destructor)(void *vaddr, ul arg);
  41. };
  42. /**
  43. * @brief 通用内存分配函数
  44. *
  45. * @param size 要分配的内存大小
  46. * @param gfp 内存的flag
  47. * @return void* 分配得到的内存的指针
  48. */
  49. void *kmalloc(unsigned long size, gfp_t gfp);
  50. /**
  51. * @brief 从kmalloc申请一块内存,并将这块内存清空
  52. *
  53. * @param size 要分配的内存大小
  54. * @param gfp 内存的flag
  55. * @return void* 分配得到的内存的指针
  56. */
  57. static __always_inline void *kzalloc(size_t size, gfp_t gfp)
  58. {
  59. return kmalloc(size, gfp | __GFP_ZERO);
  60. }
  61. /**
  62. * @brief 通用内存释放函数
  63. *
  64. * @param address 要释放的内存地址
  65. * @return unsigned long
  66. */
  67. unsigned long kfree(void *address);
  68. /**
  69. * @brief 创建一个内存池
  70. *
  71. * @param size 内存池容量大小
  72. * @param constructor 构造函数
  73. * @param destructor 析构函数
  74. * @param arg 参数
  75. * @return struct slab* 构建好的内存池对象
  76. */
  77. struct slab *slab_create(ul size, void *(*constructor)(void *vaddr, ul arg), void *(*destructor)(void *vaddr, ul arg), ul arg);
  78. /**
  79. * @brief 销毁内存池对象
  80. * 只有当slab对象是空的时候才能销毁
  81. * @param slab_pool 要销毁的内存池对象
  82. * @return ul
  83. *
  84. */
  85. ul slab_destroy(struct slab *slab_pool);
  86. /**
  87. * @brief 分配SLAB内存池中的内存对象
  88. *
  89. * @param slab_pool slab内存池
  90. * @param arg 传递给内存对象构造函数的参数
  91. * @return void* 内存空间的虚拟地址
  92. */
  93. void *slab_malloc(struct slab *slab_pool, ul arg);
  94. /**
  95. * @brief 回收slab内存池中的对象
  96. *
  97. * @param slab_pool 对应的内存池
  98. * @param addr 内存对象的虚拟地址
  99. * @param arg 传递给虚构函数的参数
  100. * @return ul
  101. */
  102. ul slab_free(struct slab *slab_pool, void *addr, ul arg);
  103. /**
  104. * @brief 在kmalloc中创建slab_obj的函数(与slab_malloc()类似)
  105. *
  106. * @param size
  107. * @return struct slab_obj* 创建好的slab_obj
  108. */
  109. struct slab_obj *kmalloc_create_slab_obj(ul size);
  110. /**
  111. * @brief 初始化内存池组
  112. * 在初始化通用内存管理单元期间,尚无内存空间分配函数,需要我们手动为SLAB内存池指定存储空间
  113. * @return ul
  114. */
  115. ul slab_init();