slab.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #pragma once
  2. #include "mm.h"
  3. #include "../common/glib.h"
  4. #include "../common/printk.h"
  5. #include "../common/kprint.h"
  6. #define SIZEOF_LONG_ALIGN(size) ((size + sizeof(long) - 1) & ~(sizeof(long) - 1))
  7. #define SIZEOF_INT_ALIGN(size) ((size + sizeof(int) - 1) & ~(sizeof(int) - 1))
  8. // SLAB存储池count_using不为空
  9. #define ESLAB_NOTNULL 101
  10. #define ENOT_IN_SLAB 102
  11. struct slab_obj
  12. {
  13. struct List *list;
  14. // 当前slab对象所使用的内存页
  15. struct Page *page;
  16. ul count_using;
  17. ul count_free;
  18. // 当前页面所在的线性地址
  19. void *vaddr;
  20. // 位图
  21. ul bmp_len; // 位图的长度(字节)
  22. ul bmp_count; // 位图的有效位数
  23. ul *bmp;
  24. };
  25. // slab内存池
  26. struct slab
  27. {
  28. ul size;
  29. ul count_total_using;
  30. ul count_total_free;
  31. // 内存池对象
  32. struct slab_obj *cache_pool;
  33. // dma内存池对象
  34. struct slab_obj *cache_dma_pool;
  35. // 内存池的构造函数和析构函数
  36. void *(*constructor)(void *vaddr, ul arg);
  37. void *(*destructor)(void *vaddr, ul arg);
  38. };
  39. /**
  40. * @brief 通用内存分配函数
  41. *
  42. * @param size 要分配的内存大小
  43. * @param flags 内存的flag
  44. * @return void*
  45. */
  46. void *kmalloc(unsigned long size, unsigned long flags);
  47. /**
  48. * @brief 通用内存释放函数
  49. *
  50. * @param address 要释放的内存地址
  51. * @return unsigned long
  52. */
  53. unsigned long kfree(void * address);
  54. /**
  55. * @brief 创建一个内存池
  56. *
  57. * @param size 内存池容量大小
  58. * @param constructor 构造函数
  59. * @param destructor 析构函数
  60. * @param arg 参数
  61. * @return struct slab* 构建好的内存池对象
  62. */
  63. struct slab *slab_create(ul size, void *(*constructor)(void *vaddr, ul arg), void *(*destructor)(void *vaddr, ul arg), ul arg);
  64. /**
  65. * @brief 销毁内存池对象
  66. * 只有当slab对象是空的时候才能销毁
  67. * @param slab_pool 要销毁的内存池对象
  68. * @return ul
  69. *
  70. */
  71. ul slab_destroy(struct slab * slab_pool);
  72. /**
  73. * @brief 分配SLAB内存池中的内存对象
  74. *
  75. * @param slab_pool slab内存池
  76. * @param arg 传递给内存对象构造函数的参数
  77. * @return void* 内存空间的虚拟地址
  78. */
  79. void* slab_malloc(struct slab *slab_pool, ul arg);
  80. /**
  81. * @brief 回收slab内存池中的对象
  82. *
  83. * @param slab_pool 对应的内存池
  84. * @param addr 内存对象的虚拟地址
  85. * @param arg 传递给虚构函数的参数
  86. * @return ul
  87. */
  88. ul slab_free(struct slab* slab_pool, void* addr, ul arg);