/************************
* 鏈表定義
************************/
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
/*************************************
* 為用戶(hù)分配size大小的heap
*size - 需要分配的大小
*return: 成功時(shí)分配的地址
失敗時(shí)NULL
*************************************/
void *mmalloc(unsigned long size)
{
blockhead *blockptr = gHeapBase;
blockhead *newblock;
Bool compacted = FALSE;
size = (size+7)&~7; /* unsigned long align the size */ //沒(méi)看明白什么意思??????????????????????????
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)) //當前塊滿(mǎn)足要求,分配成功,設置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過(guò)小,無(wú)法分配所需空間
break; //為什么不繼續看下一塊而直接退出呢??????????????????????????
}
}
else //blockptr->size < size,當前塊小于所需分配大小
{
if ((blockptr->next == NULL) && (compacted == FALSE)) //這個(gè)if毫無(wú)意義?
{ //若存在已經(jīng)丟棄的heap而用戶(hù)未主動(dòng)釋放,程序自行釋放?
if (compact_heap())
{ //compact_heap函數應該是完成整合可合并的幾個(gè)heap為一整體
compacted=TRUE;
blockptr = gHeapBase;
continue;
}
}
}
}
blockptr = blockptr->next; //當前block無(wú)法滿(mǎn)足要求,看下一塊
}//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;
}