📄 vmalloc.c
字号:
/* * vivi/lib/vmalloc.c: simple dynamic memory allocation routine * */#include <config.h>#include <memory.h>#include <vstring.h>#include <types.h>typedef long Align; /* for alignment to long boundary */union header { /* block header: */ struct { union header *ptr; /* next block if on free list */ unsigned long size; /* size of this block */ } s; Align x; /* force alignment of blocks */};typedef union header Header;static Header *freep = NULL; /* start of free list *//* vmalloc: general-purpose storage allocator for vivi */void *vmalloc(unsigned long nbytes){ Header *p, *prevp; unsigned long nunits; nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1; if ((prevp = freep) == NULL) { printk("%s(): not initialized heap\n", __FUNCTION__); return NULL; } for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr) { if (p->s.size >= nunits) { /* big enough */ if (p->s.size == nunits) { /* exactly */ prevp->s.ptr = p->s.ptr; } else { p->s.size -= nunits; p += p->s.size; p->s.size = nunits; } freep = prevp; //printk("%s(): allocated at 0x%x, size = %d\n", __FUNCTION__, (void *)(p+1), p->s.size); return (void *)(p+1); } if (p == freep) { /* wrapped around free list */ printk("%s(): no space\n", __FUNCTION__); return NULL; /* none left */ } }}/* vfree: put block ap in free list */void free(void *ap){ Header *bp, *p; bp = (Header *)ap - 1; /* point to block header */ for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* freed block at start or end of arena */ if (bp + bp->s.size == p->s.ptr) { /* join to upper nbr */ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; } else { bp->s.ptr = p->s.ptr; } if (p + p->s.size == bp) { /* join to lower nbr */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; } else { p->s.ptr = bp; } freep = p; //printk("%s(): next = 0x%x, size = %d\n", __FUNCTION__, freep->s.ptr, freep->s.size);}/* vmalloc_init: initialize heap area */void vmalloc_init(void){ unsigned long nunits = HEAP_SIZE / sizeof(Header); /* It's clear. But it's take some times */#if 0 memset(HEAP_BASE, 0x00, HEAP_SIZE);#endif freep = (Header *)HEAP_BASE; freep->s.ptr = freep; freep->s.size = nunits;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -