打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
链表 mmalloc
/************************
 * 链表定义
************************/
typedef struct blockhead_t {
Int32 signature;
Bool allocated;
unsigned long size;
struct blockhead_t *next;
struct blockhead_t *prev;
} blockhead;

/**********************
 * 链表头
**********************/
static blockhead *gHeapBase = NULL; //初始化为heap起始地址,大小为系统heap设置的大小,未标记,next,prev均为NULL


/*************************************
 * 为用户分配size大小的heap
 *size - 需要分配的大小
 *return: 成功时分配的地址
  失败时NULL
*************************************/
void *mmalloc(unsigned long size) 
{
blockhead *blockptr = gHeapBase;
blockhead *newblock;
Bool compacted = FALSE;

size = (size+7)&~7; /* unsigned long align the size */ //没看明白什么意思??????????????????????????
DPRINTK("malloc(): size = 0x%08lx\n", size);

while (blockptr != NULL) 
{
if (blockptr->allocated == FALSE) //当前块未标记,可以使用
{
if (blockptr->size >= size) 
{
blockptr->allocated=TRUE;
if ((blockptr->size - size) > sizeof(blockhead)) //当前块满足要求,分配成功,设置heap链表
{
newblock = (blockhead *)((unsigned char *)(blockptr) + sizeof(blockhead) + size);
newblock->signature = BLOCKHEAD_SIGNATURE;
newblock->prev = blockptr;
newblock->next = blockptr->next;
newblock->size = blockptr->size - size - sizeof(blockhead);
newblock->allocated = FALSE;
blockptr->next = newblock;
blockptr->size = size;
else //blockptr->size - size < sizeof(blockhead)
{ //当前块size过小,无法分配所需空间
break; //为什么不继续看下一块而直接退出呢??????????????????????????
}
else //blockptr->size < size,当前块小于所需分配大小
{
if ((blockptr->next == NULL) && (compacted == FALSE)) //这个if毫无意义?
{ //若存在已经丢弃的heap而用户未主动释放,程序自行释放?
if (compact_heap())
{ //compact_heap函数应该是完成整合可合并的几个heap为一整体
compacted=TRUE;
blockptr = gHeapBase;
continue;
}
}
}
}
blockptr = blockptr->next; //当前block无法满足要求,看下一块
}//end for while
DPRINTK("malloc(): returning blockptr = 0x%08lx\n", blockptr);
if (blockptr == NULL) //分配失败
printk("Error: malloc(), out of storage. size = 0x%x\n", size);
return (blockptr != NULL) ? ((unsigned char *)(blockptr)+sizeof(blockhead)) : NULL; //返回指向分配地址的指针
}

static int compact_heap(void) 
{
// return non-zero if heap was compacted
return 0;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
太强了!一文搞定虚拟内存模型和malloc内部原理!(附22段代码)
ion system allocate
《关于libstagefright系列漏洞分析》的评论
一份通俗易懂的C语言内存总结
【Android Camera】之 Preview
C语言 内存分配器实现(malloc,free,realloc)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服