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

📄 boot.c

📁 著名操作系统Plan 9的第三版的部分核心源代码。现在很难找到了。Plan 9是bell实验室开发的Unix后继者。
💻 C
字号:
#include "u.h"#include "lib.h"#include "mem.h"#include "dat.h"#include "fns.h"#include "io.h"static intaddbytes(char **dbuf, char *edbuf, char **sbuf, char *esbuf){	int n;	n = edbuf - *dbuf;	if(n <= 0)		return 0;	if(n > esbuf - *sbuf)		n = esbuf - *sbuf;	if(n <= 0)		return -1;	memmove(*dbuf, *sbuf, n);	*sbuf += n;	*dbuf += n;	return edbuf - *dbuf;}intbootpass(Boot *b, void *vbuf, int nbuf){	char *buf, *ebuf;	Exec *ep;	ulong entry, data, text, bss;	if(b->state == FAILED)		return FAIL;	if(nbuf == 0)		goto Endofinput;	buf = vbuf;	ebuf = buf+nbuf;	while(addbytes(&b->wp, b->ep, &buf, ebuf) == 0) {		switch(b->state) {		case INITKERNEL:			b->state = READEXEC;			b->bp = (char*)&b->exec;			b->wp = b->bp;			b->ep = b->bp+sizeof(Exec);			break;		case READEXEC:			ep = &b->exec;			if(GLLONG(ep->magic) == I_MAGIC) {				b->state = READTEXT;				b->bp = (char*)PADDR(GLLONG(ep->entry));				b->wp = b->bp;				b->ep = b->wp+GLLONG(ep->text);				print("%ld", GLLONG(ep->text));				break;			}			/* check for gzipped kernel */			if(b->bp[0] == 0x1F && (uchar)b->bp[1] == 0x8B && b->bp[2] == 0x08) {				b->state = READGZIP;				b->bp = (char*)malloc(1024*1024);				b->wp = b->bp;				b->ep = b->wp + 1024*1024;				memmove(b->bp, &b->exec, sizeof(Exec));				b->wp += sizeof(Exec);				print("gz...");				break;			}			print("bad kernel format\n");			b->state = FAILED;			return FAIL;		case READTEXT:			ep = &b->exec;			b->state = READDATA;			b->bp = (char*)PGROUND(GLLONG(ep->entry)+GLLONG(ep->text));			b->wp = b->bp;			b->ep = b->wp + GLLONG(ep->data);			print("+%ld", GLLONG(ep->data));			break;			case READDATA:			ep = &b->exec;			bss = GLLONG(ep->bss);			print("+%ld=%ld\n",				bss, GLLONG(ep->text)+GLLONG(ep->data)+bss);			b->state = TRYBOOT;			return ENOUGH;		case TRYBOOT:		case READGZIP:			return ENOUGH;		case READ9LOAD:		case INIT9LOAD:			panic("9load");		default:			panic("bootstate");		}	}	return MORE;Endofinput:	/* end of input */	switch(b->state) {	case INITKERNEL:	case READEXEC:	case READDATA:	case READTEXT:		print("premature EOF\n");		b->state = FAILED;		return FAIL;		case TRYBOOT:		entry = GLLONG(b->exec.entry);		print("entry: 0x%lux\n", entry);		warp9(PADDR(entry));		b->state = FAILED;		return FAIL;	case READGZIP:		ep = &b->exec;		if(b->bp[0] != 0x1F || (uchar)b->bp[1] != 0x8B || b->bp[2] != 0x08)			print("lost magic\n");		print("%ld => ", b->wp - b->bp);		if(gunzip((uchar*)ep, sizeof(*ep), (uchar*)b->bp, b->wp - b->bp) < sizeof(*ep)) {			print("badly compressed kernel\n");			return FAIL;		}		entry = GLLONG(ep->entry);		text = GLLONG(ep->text);		data = GLLONG(ep->data);		bss = GLLONG(ep->bss);		print("%lud+%lud+%lud=%lud\n", text, data, bss, text+data+bss);		if(gunzip((uchar*)PADDR(entry)-sizeof(Exec), sizeof(Exec)+text+data, 		     (uchar*)b->bp, b->wp-b->bp) < sizeof(Exec)+text+data) {			print("error uncompressing kernel\n");			return FAIL;		}		/* relocate data to start at page boundary */		memmove((void*)PGROUND(entry+text), (void*)PADDR(entry+text), data);		print("entry: %lux\n", entry);		warp9(PADDR(entry));		b->state = FAILED;		return FAIL;	case INIT9LOAD:	case READ9LOAD:		panic("end 9load");	default:		panic("bootdone");	}	b->state = FAILED;	return FAIL;}

⌨️ 快捷键说明

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