现在的位置: 首页 > 综合 > 正文

linux 0.11 中malloc的实现

2013年10月31日 ⁄ 综合 ⁄ 共 889字 ⁄ 字号 评论关闭

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

 

 

抱歉!评论已关闭.