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

📄 malloc.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "all.h"#include "mem.h"#include "io.h"long	niob;long	nhiob;Hiob	*hiob;/* * Called to allocate permanent data structures * Alignment is in number of bytes. It pertains both to the start and * end of the allocated memory. */void*ialloc(ulong n, int align){	Mbank *mbp;	ulong p;	int m;	ilock(&mconf);	for(mbp = &mconf.bank[0]; mbp < &mconf.bank[mconf.nbank]; mbp++){		p = mbp->base;		if(align <= 0)			align = 4;		if(m = n % align)			n += align - m;		if(m = p % align)			p += align - m;		if(p+n > mbp->limit)			continue;		mbp->base = p+n;		iunlock(&mconf);		memset((void*)(p|KZERO), 0, n);		return (void*)(p|KZERO);	}	iunlock(&mconf);	for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)		print("bank[%ld]: base 0x%8.8lux, limit 0x%8.8lux\n",			mbp - mconf.bank, mbp->base, mbp->limit);	panic("ialloc(0x%lux, 0x%lx): out of memory\n", n, align);	return 0;}voidprbanks(void){	Mbank *mbp;	for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)		print("bank[%ld]: base 0x%8.8lux, limit 0x%8.8lux\n",			mbp - mconf.bank, mbp->base, mbp->limit);}static voidcmd_memory(int, char *[]){	prbanks();}/* * allocate rest of mem * for io buffers. */#define	HWIDTH	8	/* buffers per hash */voidiobufinit(void){	long m;	int i;	Iobuf *p, *q;	Hiob *hp;	Mbank *mbp;	wlock(&mainlock);	/* init */	wunlock(&mainlock);	prbanks();	m = 0;	for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++) {		m += mbp->limit - mbp->base;	}	m -= conf.sparemem;	niob = m / (sizeof(Iobuf) + RBUFSIZE + sizeof(Hiob)/HWIDTH);	nhiob = niob / HWIDTH;	while(!prime(nhiob))		nhiob++;	print("	%ld buffers; %ld hashes\n", niob, nhiob);	hiob = ialloc(nhiob * sizeof(Hiob), 0);	hp = hiob;	for(i=0; i<nhiob; i++) {		lock(hp);		unlock(hp);		hp++;	}	p = ialloc(niob * sizeof(Iobuf), 0);	hp = hiob;	for(i=0; i<niob; i++) {		p->name = "buf";		qlock(p);		qunlock(p);		if(hp == hiob)			hp = hiob + nhiob;		hp--;		q = hp->link;		if(q) {			p->fore = q;			p->back = q->back;			q->back = p;			p->back->fore = p;		} else {			hp->link = p;			p->fore = p;			p->back = p;		}		p->dev = devnone;		p->addr = -1;		p->xiobuf = ialloc(RBUFSIZE, RBUFSIZE);		p->iobuf = (char*)-1;		p++;	}	/*	 * Make sure that no more of bank[0] can be used:	 * 'check' will do an ialloc(0, 1) to find the base of	 * sparemem.	 */	mconf.bank[0].base = mconf.bank[0].limit+1;	i = 0;	for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)		i += mbp->limit - mbp->base;	print("	mem left = %,d, out of %,ld\n", i, conf.mem);	/* paranoia: add this command as late as is easy */	cmd_install("memory", "-- print ranges of memory banks", cmd_memory);}void*iobufmap(Iobuf *p){	return p->iobuf = p->xiobuf;}voidiobufunmap(Iobuf *p){	p->iobuf = (char*)-1;}

⌨️ 快捷键说明

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