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

📄 mworm.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include	"all.h"/* * multiple cat devices */voidmcatinit(Device *d){	Device *x, **list;	d->cat.ndev = 0;	for(x=d->cat.first; x; x=x->link) {		devinit(x);		d->cat.ndev++;	}	list = ialloc(d->cat.ndev*sizeof(Device*), 0);	d->private = list;	for(x=d->cat.first; x; x=x->link) {		*list++ = x;		x->size = devsize(x);	}}Devsizemcatsize(Device *d){	Device *x;	Devsize l, m;	l = 0;	for(x=d->cat.first; x; x=x->link) {		m = x->size;		if(m == 0) {			m = devsize(x);			x->size = m;		}		l += m;	}	return l;}intmcatread(Device *d, Off b, void *c){	Device *x;	Devsize l, m;	l = 0;	for(x=d->cat.first; x; x=x->link) {		m = x->size;		if(m == 0) {			m = devsize(x);			x->size = m;		}		if(b < l+m)			return devread(x, b-l, c);		l += m;	}	print("mcatread %lld %lld\n", (Wideoff)b, (Wideoff)l);	return 1;}intmcatwrite(Device *d, Off b, void *c){	Device *x;	Devsize l, m;	l = 0;	for(x=d->cat.first; x; x=x->link) {		m = x->size;		if(m == 0) {			m = devsize(x);			x->size = m;		}		if(b < l+m)			return devwrite(x, b-l, c);		l += m;	}	print("mcatwrite %lld %lld\n", (Wideoff)b, (Wideoff)l);	return 1;}/* * multiple interleave devices */voidmlevinit(Device *d){	Device *x;	mcatinit(d);	for(x=d->cat.first; x; x=x->link)		x->size = devsize(x);}Devsizemlevsize(Device *d){	Device *x;	int n;	Devsize m, min;	min = 0;	n = 0;	for(x=d->cat.first; x; x=x->link) {		m = x->size;		if(m == 0) {			m = devsize(x);			x->size = m;		}		if(min == 0 || m < min)			min = m;		n++;	}	return n * min;}intmlevread(Device *d, Off b, void *c){	int n;	Device **list;	n = d->cat.ndev;	list = d->private;	return devread(list[b%n], b/n, c);}intmlevwrite(Device *d, Off b, void *c){	int n;	Device **list;	n = d->cat.ndev;	list = d->private;	return devwrite(list[b%n], b/n, c);}/* * partition device */voidpartinit(Device *d){	devinit(d->part.d);	d->part.d->size = devsize(d->part.d);}Devsizepartsize(Device *d){	Devsize size, l;	l = d->part.d->size / 100;	size = d->part.size * l;	if(size == 0)		size = l*100;	return size;}intpartread(Device *d, Off b, void *c){	Devsize base, size, l;	l = d->part.d->size / 100;	base = d->part.base * l;	size = d->part.size * l;	if(size == 0)		size = l*100;	if(b < size)		return devread(d->part.d, base+b, c);	print("partread %lld %lld\n", (Wideoff)b, (Wideoff)size);	return 1;}intpartwrite(Device *d, Off b, void *c){	Devsize base, size, l;	l = d->part.d->size / 100;	base = d->part.base * l;	size = d->part.size * l;	if(size == 0)		size = l*100;	if(b < size)		return devwrite(d->part.d, base+b, c);	print("partwrite %lld %lld\n", (Wideoff)b, (Wideoff)size);	return 1;}/* * mirror device */voidmirrinit(Device *d){	Device *x;	mcatinit(d);	for(x=d->cat.first; x; x=x->link)		x->size = devsize(x);}Devsizemirrsize(Device *d){	Device *x;	int n;	Devsize m, min;	min = 0;	n = 0;	for(x=d->cat.first; x; x=x->link) {		m = x->size;		if(m == 0) {			m = devsize(x);			x->size = m;		}		if(min == 0 || m < min)			min = m;		n++;	}	return min;}intmirrread(Device *d, Off b, void *c){	Device *x;	for(x=d->cat.first; x; x=x->link) {		if(x->size == 0)			x->size = devsize(x);		if (devread(x, b, c) == 0)	/* okay? */			return 0;	}	// DANGER WILL ROBINSON - all copies of this block were bad	print("mirrread %Z error at block %lld\n", d, (Wideoff)b);	return 1;}/* * write the mirror(s) first so that a power outage, for example, will * find the main device written only if the mirrors are too, thus * checking the main device will also correctly check the mirror(s). * * devread and devwrite are synchronous; all buffering must be * implemented at higher levels. */static intewrite(Device *x, Off b, void *c){	if(x->size == 0)		x->size = devsize(x);	if (devwrite(x, b, c) != 0) {		print("mirrwrite %Z error at block %lld\n", x, (Wideoff)b);		return 1;	}	return 0;}static intwrmirrs1st(Device *x, Off b, void *c)	// write any mirrors of x, then x{	int e;	if (x == nil)		return 0;	e = wrmirrs1st(x->link, b, c);	return e | ewrite(x, b, c);}intmirrwrite(Device *d, Off b, void *c){	return wrmirrs1st(d->cat.first, b, c);}

⌨️ 快捷键说明

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