⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 malloc.c

📁 开源的BIOS启动软件
💻 C
字号:
#include <bios/malloc.h>#include <bios/system.h>#include <bios/debug.h>#ifndef DEBUG# define debug_printf(x...)#endif/* * Make sure we're aligned to this */#define OVERHEAD	16struct free {	int		size;	struct free	*next;};static struct free *free_list;extern int ram_size;void malloc_init(void){	free_list = (struct free *)(ram_size - 1048576);	free_list->next = NULL;	free_list->size = 1048576;}void *malloc(int size){	struct free **f;	void *ptr = NULL;	flags_t flags;	/*	 * We will need to align it, so...	 */	size = (size + 15 + OVERHEAD) & ~15;	debug_printf("malloc(%d)", size);	flags = save_flags();	cli();	for (f = &free_list; *f; f = &(*f)->next) {		struct free *tf, *nf;		tf = *f;		debug_printf(" (chk blk %p sz %d)", tf, tf->size);		if (tf->size < size)			continue;		ptr = (void *)((int)tf + OVERHEAD);		if (tf->size >= size + sizeof(struct free)) {			nf = (struct free *)((int)tf + size);			nf->next = tf->next;			nf->size = tf->size - size;			*f = nf;			debug_printf(" (new blk %p sz %d)", nf, nf->size);		} else {			debug_printf(" (exact)");			*f = tf->next;		}		tf->size = size;		break;	}	restore_flags(flags);	debug_printf(" at %p\n", ptr);	return ptr;}void free(void *ptr){	struct free *tf, **ff;	flags_t flags;	if (!ptr)		return;	tf = (struct free *)((int)ptr - OVERHEAD);	debug_printf("free(%p) size %d", ptr, tf->size);	flags = save_flags();	cli();	for (ff = &free_list; *ff; ff = &(*ff)->next) {		struct free *pf;		pf = *ff;		if ((int)pf + pf->size == (int)tf) {			debug_printf(" (prev %p sz %d)", pf, pf->size);			pf->size += tf->size;			tf = pf;			ptr = NULL;		}		if ((int)tf + tf->size == (int)pf) {			debug_printf(" (next %p sz %d)", pf, pf->size);			tf->next = pf->next;			tf->size += pf->size;			*ff = tf;			ptr = NULL;		}	}	if (ptr) {		for (ff = &free_list; *ff && (int)*ff < (int)tf; ff = &(*ff)->next);		tf->next = *ff;		*ff = tf;	}	restore_flags(flags);	debug_printf("\n");}

⌨️ 快捷键说明

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