在0.11中, 用桶描述符来实现malloc内存的管理。
首先定义了8个bucket_dir,类似于桶目录,桶目录指向对应大小的bucket_desc。
每个桶描述符bucket_desc指向一页内存,该页内存用于分配 大小为n的 动态内存。
struct _bucket_dir bucket_dir[] = {
{ 16, (struct bucket_desc *) 0},
{ 32, (struct bucket_desc *) 0},
{ 64, (struct bucket_desc *) 0},
{ 128, (struct bucket_desc *) 0},
{ 256, (struct bucket_desc *) 0},
{ 512, (struct bucket_desc *) 0},
{ 1024, (struct bucket_desc *) 0},
{ 2048, (struct bucket_desc *) 0},
{ 4096, (struct bucket_desc *) 0},
{ 0, (struct bucket_desc *) 0}}; /* End of list marker */
struct bucket_desc { /* 16 bytes */
void *page;
struct bucket_desc *next;
void *freeptr;
unsigned short refcnt;
unsigned short bucket_size;
};
struct _bucket_dir { /* 8 bytes */
int size;
struct bucket_desc *chain;
};
这样bucket_desc中的freeptr指向可以分配的下个存储区的地址。其中在该地址的前四个字节存储了可以分配的 下一个 存储区的地址,所以当freeptr指向的地址被 分配后,freeptr就可以找到他要指向的下一个地址。
同理,当一个地址addr被释放时,addr就指向目前freeptr的地址,然后让freeptr指向addr。 这样就实现了释放。
另外,在释放一个地址时,先根据地址,得到该内存所在的页面。然后根据页面值,遍历 bucket_desc 就可以找到这个页面对应的bucket_desc。进而释放地址。