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

📄 boot.c

📁 freebsd v4.4内核源码
💻 C
字号:
/* * FreeBSD kernel unpacker. * 1993 by Serge Vakulenko * modified for FreeBSD 2.1 by Gary Jennejohn - 12FEB95 *//* * FreeBSD(98) port * 1995 by KATO T. of Nagoya University */#include <sys/types.h>#include <sys/reboot.h>		/* for RB_SERIAL */#include <machine/cpufunc.h>	/* for inb/outb */short *videomem;int curs;int cols;int lines;unsigned int port;#ifdef PC98unsigned char bios[0x200];#elseunsigned char bios[0x100];#endifextern int end, edata;void *storage;void *inbuf;void *outbuf;void *window;void decompress_kernel (void *dest);int memcmp (const void *arg1, const void *arg2, unsigned len){	unsigned char *a = (unsigned char*) arg1;	unsigned char *b = (unsigned char*) arg2;	for (; len-- > 0; ++a, ++b)		if (*a < *b)			return (-1);		else if (*a > *b)			return (1);	return (0);}void *memcpy (void *to, const void *from, unsigned len){	char *f = (char*) from;	char *t = (char*) to;	while (len-- > 0)		*t++ = *f++;	return (to);}void serial_putchar (unsigned char c){	unsigned char stat;	if (c == '\n')		serial_putchar('\r');#ifdef PC98	do {		 stat = inb (COMCONSOLE+2);	} while (!(stat & 0x01));#else	do {		 stat = inb (COMCONSOLE+5);	} while (!(stat & 0x20));#endif	outb (COMCONSOLE, c);}void putchar (unsigned char c){	switch (c) {	case '\n':      curs = (curs + cols) / cols * cols;     break;#ifdef PC98	default:        videomem[curs++] = (c == 0x5c ? 0xfc : c);   break;#else	default:        videomem[curs++] = 0x0700 | c;          break;#endif	}	while (curs >= cols*lines) {		int col;		memcpy (videomem, videomem+cols, (lines-1) * cols * 2);		for (col = 0; col < cols; col++)#ifdef PC98			videomem[(lines - 1) * cols + col] = 0x20;#else			videomem[(lines - 1) * cols + col] = 0x720;#endif		curs -= cols;	}	/* set cursor position */#ifdef PC98	while ((inb(0x60) & 0x04) == 0) {}	outb(0x62, 0x49);	outb(0x60, (curs + 1) & 0xff);	outb(0x60, (curs + 1) >> 8);#else	outb (port, 0x0e); outb (port+1, curs>>8);	outb (port, 0x0f); outb (port+1, curs);#endif}int use_serial;void putstr (char *s){	while (*s) {		if (use_serial)			serial_putchar (*s++);		else			putchar (*s++);	}}void error (char *s){	putstr ("\n\n");	putstr (s);	putstr ("\n\n -- System halted");	while (1);                      /* Halt */}void boot (int howto){	int l, c, *p;#ifdef PC98	unsigned short gdc_curaddr;	int i;#endif	/* clear bss */	for (p = &edata; p < &end; ++p)		*p = 0;	inbuf   = (void *)0x20000;	outbuf  = (void *)0x30000;	window  = (void *)0x40000;	storage = (void *)0x50000;	if (!(use_serial = (howto & RB_SERIAL))) {#ifdef PC98		videomem = (void*)0xa0000;		cols = 80;		lines = 25;		/* Is FIFO buffer empty ? */		while ((inb(0x60) & 0x04) == 0) {}		outb(0x62, 0xe0);	/* CSRR command */		/* T-GDC busy ? */		while ((inb(0x60) & 0x01) == 0) {}		/* read cursor address */		gdc_curaddr = inb(0x62);		gdc_curaddr += (inb(0x62) << 8);		/* ignore rest of data */		for (i = 0; i < 3; i++) {			(void)inb(0x62);		}		l = gdc_curaddr / 80 + 1;		c = 0;#else		/* Test for monochrome video adapter */		if ((*((unsigned char*) 0x410) & 0x30) == 0x30)			videomem = (void*) 0xb0000;     /* monochrome */		else			videomem = (void*) 0xb8000;     /* color */		port = *(unsigned short*) 0x463;		cols = *(unsigned short*) 0x44a;		lines = 1 + *(unsigned char*) 0x484;		c = *(unsigned char*) 0x450;		l = *(unsigned char*) 0x451;#endif		if (lines < 25)			lines = 25;		curs = l*cols + c;		if (curs > lines*cols)			curs = (lines-1) * cols;	}	putstr ("Uncompressing kernel...");	decompress_kernel ((void*) KADDR);	putstr ("done\n");	putstr ("Booting the kernel\n");}

⌨️ 快捷键说明

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