linux 0.11 中malloc的实现

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值