heap.c

来自「Windows上的精简Linux系统」· C语言 代码 · 共 74 行

C
74
字号
/* * Very simple heap manager. * Allocation Strategy: The lower end of the heap, is the end of the BSS. * * During an alloc, if there is enough space below the high end of heap,  *    we return a pointer to the allocated space and move curr. * Space once allocated is never deallocated! * We run out of space if we get within BUFSIZE bytes of the stack pointer. */#include "heap.h"#include "string.h"#include "biosio.h"#ifndef NULL#define NULL ((void *)0)#endifextern char _end[];static unsigned int heap_curr  = (unsigned int)_end;static inline unsigned int currsp(void){    unsigned int esp;        asm("movl %%esp,%0 " : "=rm" (esp));    return esp;}static inline void _checkheap(void){    if (currsp() < heap_curr) // Heap corrupted    {	csprint("\r\nHeap overflow, aborting!\r\n",0x07);	asm volatile("int $0x21" : : "a" (0x4C7f)); /* Exit with error */	return;    }}void * malloc(unsigned int num) // Allocate so much space{    unsigned int ans, heap_max;    _checkheap();    heap_max = currsp() - STACKSIZE;    ans = (heap_curr+3) & ~3;	// Align to 4-byte boundary    if ( ans+num > heap_max )	return NULL;    heap_curr = ans+num;    return (void *) ans;}/* We don't actually ever use these; if enabled,   probably _checkheap() shouldn't be inline.*/#if 0int checkalloc(unsigned int num){    _checkheap();    return (heap_curr + num < heap_max);}void free(void * ptr){    _checkheap();    return;}#endif

⌨️ 快捷键说明

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