malloc.c

来自「国产CPU-龙芯(loongson)BIOS源代码」· C语言 代码 · 共 101 行

C
101
字号
/* simple malloc function */#include <stdio.h>#define AAT_SIZE 1024static unsigned char pile[64*1024];static int initial = 0;static void *pile_base = NULL;typedef struct alloc_addr{    void *addr;    unsigned int size;    unsigned char flag;} alloc_addr;alloc_addr alloc_addr_table[AAT_SIZE];void init_AAT(){    int i = 0;    pile_base = pile + 24;    for(i=0;i<AAT_SIZE;i++)    {	alloc_addr_table[i].addr = 0;	alloc_addr_table[i].size = 0;	alloc_addr_table[i].flag = 0;    }}void *get_free_mem(int size){    int i = 0;    int j = 0;    void *prev = pile_base;    for(i=0;i<AAT_SIZE;i++)    {	if (alloc_addr_table[i].flag)	{	    if (alloc_addr_table[i].addr - prev < size)	    {		prev = alloc_addr_table[i].addr + alloc_addr_table[i].size;		continue;	    }	    else	    {		for (j = AAT_SIZE - 1; j>i; j--)		{		    if (!alloc_addr_table[j-1].flag)			continue;		    alloc_addr_table[j].addr = alloc_addr_table[j-1].addr;		    alloc_addr_table[j].size = alloc_addr_table[j-1].size;		    alloc_addr_table[j].flag = alloc_addr_table[j-1].flag;		}		alloc_addr_table[i].addr = prev;		alloc_addr_table[i].size = size;		alloc_addr_table[i].flag = 1;		return alloc_addr_table[i].addr;	    }	}	if (!alloc_addr_table[i].flag)	{	    alloc_addr_table[i].addr = prev;	    alloc_addr_table[i].size = size;	    alloc_addr_table[i].flag = 1;	    return alloc_addr_table[i].addr;	}    }    if (i == AAT_SIZE)	panic("stack full");}void  *malloc(int size){    if (!initial)    {	init_AAT();	initial = 1;    }    void * base = NULL;    base = get_free_mem(size);    return base;}void free(void *base){    int i = 0;    int j = 0;    for (i = 0;i < AAT_SIZE; i++)    {	if (alloc_addr_table[i].addr == base)	    for(j=i;j<AAT_SIZE;j++)	    {		if (!alloc_addr_table[j].flag)		    break;		alloc_addr_table[j].addr = alloc_addr_table[j+1].addr;		alloc_addr_table[j].size = alloc_addr_table[j+1].size;		alloc_addr_table[j].flag = alloc_addr_table[j+1].flag;	    }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?