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

📄 vmalloc.c

📁 SMDK2440 boot code, base on vivi
💻 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 + -