在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。进而释放地址。