📄 malloc.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 + -