亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bootimage.c

?? 操作系統引導映像程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*	bootimage.c - Load an image and start it.	Author: Kees J. Bot
 *								19 Jan 1992
 */
#define nil 0
#define _POSIX_SOURCE	1
#define _MINIX		1
#include <stddef.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <errno.h>
#include <a.out.h>
#include <minix/config.h>
#include <minix/const.h>
#include <minix/type.h>
#include <kernel/const.h>
#include <kernel/type.h>
#include <ibm/partition.h>
#include "rawfs.h"
#include "image.h"
#include "boot.h"

void printk(char *fmt, ...);
#define	printf	printk

#define click_shift	clck_shft	/* 7 char clash with click_size. */

/* Some kernels have extra features: */
#define K_I386	 0x0001	/* Make the 386 transition before you call me. */
#define K_CLAIM	 0x0002	/* I will acquire my own bss pages, thank you. */
#define K_CHMEM  0x0004	/* This kernel listens to chmem for its stack size. */
#define K_HIGH   0x0008	/* Load mm, fs, etc. in extended memory. */
#define K_HDR	 0x0010	/* No need to patch sizes, kernel uses the headers. */
#define K_RET	 0x0020	/* Returns to the monitor on reboot. */


/* Data about the different processes. */

#define PROCESS_MAX	16	/* Must match the space in kernel/mpx.x */
#define KERNEL		0	/* The first process is the kernel. */
#define FS		2	/* The third must be fs. */

struct process {
	char	name[IM_NAME_MAX + 1]; /* Nice to have a name for the thing. */
	u32_t	entry;		/* Entry point. */
	u32_t	cs;		/* Code segment. */
	u32_t	ds;		/* Data segment. */
	u32_t	data;		/* To access the data segment. */
	u32_t	end;		/* End of this process, size = (end - cs). */
} process[PROCESS_MAX];
int n_procs;			/* Number of processes. */

/* Magic numbers in process' data space. */
#define MAGIC_OFF	0	/* Offset of magic # in data seg. */
#define CLICK_OFF	2	/* Offset in kernel text to click_shift. */
#define FLAGS_OFF	4	/* Offset in kernel text to flags. */
#define KERNEL_D_MAGIC	0x526F	/* Kernel magic number. */

/* Offsets of sizes to be patched into kernel and fs. */
#define P_SIZ_OFF	0	/* Process' sizes into kernel data. */
#define P_INIT_OFF	4	/* Init cs & sizes into fs data. */


#define between(a, c, z)	((unsigned) ((c) - (a)) <= ((z) - (a)))

void pretty_image(char *image)
/* Pretty print the name of the image to load.  Translate '/' and '_' to
 * space, first letter goes uppercase.  An 'r' before a digit prints as
 * 'revision'.  E.g. 'minix/1.6.16r10' -> 'Minix 1.6.16 revision 10'.
 * The idea is that the part before the 'r' is the official Minix release
 * and after the 'r' you can put version numbers for your own changes.
 */
{
	int up= 0, c;

	while ((c= *image++) != 0) {
		if (c == '/' || c == '_') c= ' ';

		if (c == 'r' && between('0', *image, '9')) {
			printf(" revision ");
			continue;
		}
		if (!up && between('a', c, 'z')) c= c - 'a' + 'A';

		if (between('A', c, 'Z')) up= 1;

		putchar(c);
	}
}

void raw_clear(u32_t addr, u32_t count)
/* Clear "count" bytes at absolute address "addr". */
{
	static char zeros[128];
	u32_t dst;
	u32_t zct;

	zct= sizeof(zeros);
	if (zct > count) zct= count;
	raw_copy(addr, mon2abs(&zeros), zct);
	count-= zct;

	while (count > 0) {
		dst= addr + zct;
		if (zct > count) zct= count;
		raw_copy(dst, addr, zct);
		count-= zct;
		zct*= 2;
	}
}

/* Align a to a multiple of n (a power of 2): */
#define align(a, n)	(((u32_t)(a) + ((u32_t)(n) - 1)) & ~((u32_t)(n) - 1))
unsigned click_shift;
unsigned click_size;	/* click_size = Smallest kernel memory object. */
unsigned k_flags;	/* Not all kernels are created equal. */

void patch_sizes(void)
/* Patch sizes of each process into kernel data space, kernel ds into kernel
 * text space, and sizes of init into data space of fs.  All the patched
 * numbers are based on the kernel click size, not hardware segments.
 */
{
	u16_t text_size, data_size;
	int i;
	struct process *procp, *initp;
	u32_t doff;

	if (k_flags & K_HDR) return;	/* Uses the headers. */

	/* Patch text and data sizes of the processes into kernel data space.
	 */
	doff= process[KERNEL].data + P_SIZ_OFF;

	for (i= 0; i < n_procs; i++) {
		procp= &process[i];
		text_size= (procp->ds - procp->cs) >> click_shift;
		data_size= (procp->end - procp->ds) >> click_shift;

		/* Two words per process, the text and data size: */
		put_word(doff, text_size); doff+= 2;
		put_word(doff, data_size); doff+= 2;

		initp= procp;	/* The last process must be init. */
	}

	if (k_flags & K_HIGH) return;	/* Doesn't need FS patching. */

	/* Patch cs and sizes of init into fs data. */
	put_word(process[FS].data + P_INIT_OFF+0, initp->cs >> click_shift);
	put_word(process[FS].data + P_INIT_OFF+2, text_size);
	put_word(process[FS].data + P_INIT_OFF+4, data_size);
}

int selected(char *name)
/* True iff name has no label or the proper label. */
{
	char *colon, *label;
	int cmp;

	if ((colon= strchr(name, ':')) == nil) return 1;
	if ((label= b_value("label")) == nil) return 1;

	*colon= 0;
	cmp= strcmp(label, name);
	*colon= ':';
	return cmp == 0;
}

u32_t proc_size(struct image_header *hdr)
/* Return the size of a process in sectors as found in an image. */
{
	u32_t len= hdr->process.a_text;

	if (hdr->process.a_flags & A_PAL) len+= hdr->process.a_hdrlen;
	if (hdr->process.a_flags & A_SEP) len= align(len, SECTOR_SIZE);
	len= align(len + hdr->process.a_data, SECTOR_SIZE);

	return len >> SECTOR_SHIFT;
}

off_t image_off, image_size;
u32_t (*vir2sec)(u32_t vsec);		/* Where is a sector on disk? */

u32_t file_vir2sec(u32_t vsec)
/* Translate a virtual sector number to an absolute disk sector. */
{
	off_t blk;

	if ((blk= r_vir2abs(vsec / RATIO)) == -1) {
		errno= EIO;
		return -1;
	}
	return blk == 0 ? 0 : lowsec + blk * RATIO + vsec % RATIO;
}

u32_t flat_vir2sec(u32_t vsec)
/* Simply add an absolute sector offset to vsec. */
{
	return lowsec + image_off + vsec;
}

char *get_sector(u32_t vsec)
/* Read a sector "vsec" from the image into memory and return its address.
 * Return nil on error.  (This routine tries to read an entire track, so
 * the next request is usually satisfied from the track buffer.)
 */
{
	u32_t sec;
	int r;
	static char buf[32 * SECTOR_SIZE];
	static size_t count;		/* Number of sectors in the buffer. */
	static u32_t bufsec;		/* First Sector now in the buffer. */

	if (vsec == 0) count= 0;	/* First sector; initialize. */

	if ((sec= (*vir2sec)(vsec)) == -1) return nil;

	if (sec == 0) {
		/* A hole. */
		count= 0;
		memset(buf, 0, SECTOR_SIZE);
		return buf;
	}

	/* Can we return a sector from the buffer? */
	if ((sec - bufsec) < count) {
		return buf + ((size_t) (sec - bufsec) << SECTOR_SHIFT);
	}

	/* Not in the buffer. */
	count= 0;
	bufsec= sec;

	/* Read a whole track if possible. */
	while (++count < 32 && (bufsec + count) % sectors != 0) {
		vsec++;
		if ((sec= (*vir2sec)(vsec)) == -1) break;

		/* Consecutive? */
		if (sec != bufsec + count) break;
	}

	/* Actually read the sectors. */
	if ((r= readsectors(mon2abs(buf), bufsec, count)) != 0) {
		readerr(bufsec, r);
		count= 0;
		errno= 0;
		return nil;
	}
	return buf;
}

int get_clickshift(u32_t ksec, struct image_header *hdr)
/* Get the click shift and special flags from kernel text. */
{
	char *textp;

	if ((textp= get_sector(ksec)) == nil) return 0;

	if (hdr->process.a_flags & A_PAL) textp+= hdr->process.a_hdrlen;
	click_shift= * (u16_t *) (textp + CLICK_OFF);
	k_flags= * (u16_t *) (textp + FLAGS_OFF);

	if (click_shift < HCLICK_SHIFT || click_shift > 16) {
		printf("%s click size is bad\n", hdr->name);
		errno= 0;
		return 0;
	}

	click_size= 1 << click_shift;

	return 1;
}

int get_segment(u32_t *vsec, long *size, u32_t *addr, u32_t limit)
/* Read *size bytes starting at virtual sector *vsec to memory at *addr. */
{
	char *buf;
	size_t cnt, n;

	cnt= 0;
	while (*size > 0) {
		if (cnt == 0) {
			if ((buf= get_sector((*vsec)++)) == nil) return 0;
			cnt= SECTOR_SIZE;
		}
		if (*addr + click_size > limit) { errno= ENOMEM; return 0; }
		n= click_size;
		if (n > cnt) n= cnt;
		raw_copy(*addr, mon2abs(buf), n);
		*addr+= n;
		*size-= n;
		buf+= n;
		cnt-= n;
	}

	/* Zero extend to a click. */
	n= align(*addr, click_size) - *addr;
	raw_clear(*addr, n);
	*addr+= n;
	*size-= n;
	return 1;
}

void exec_image(char *image, char *params, size_t paramsize)
/* Get a Minix image into core, patch it up and execute. */
{
	int i;
	struct image_header hdr;
	char *buf;
	u32_t vsec= 0;		/* Load this sector from image next. */
	u32_t addr= MINIXPOS;	/* Put it at this address. */
	u32_t limit= caddr;	/* But no further than this address. */
	u32_t n;
	struct process *procp;	/* Process under construction. */
	long a_text, a_data, a_bss, a_stack;
	char *msec, *console;
	u16_t mode;
	int banner= 0;
	long processor= a2l(b_value("processor"));

	/* Clear the area where the headers will be placed. */
	raw_clear(HEADERPOS, PROCESS_MAX * A_MINHDR);

	/* Read the many different processes: */
	for (i= 0; vsec < image_size; i++) {
		if (i == PROCESS_MAX) {
			printf("There are more then %d programs in %s\n",
				PROCESS_MAX, image);
			errno= 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产在线观看| 中文字幕第一区二区| 亚洲午夜久久久久| 91浏览器打开| 一区二区免费看| 欧美亚洲高清一区| 亚洲一级二级三级在线免费观看| 欧美在线观看一区| 亚洲午夜电影在线观看| 在线综合视频播放| 青娱乐精品在线视频| www国产精品av| 成人久久久精品乱码一区二区三区| 欧美经典三级视频一区二区三区| 97久久精品人人做人人爽50路| 亚洲最色的网站| 欧美另类z0zxhd电影| 日韩成人精品在线| 久久亚洲综合色一区二区三区| 成人黄色a**站在线观看| 亚洲天堂a在线| 91精选在线观看| 国产老妇另类xxxxx| 国产精品私人自拍| 欧美私模裸体表演在线观看| 蜜臀av性久久久久蜜臀aⅴ| 久久久久久久久久久久电影| 91论坛在线播放| 奇米精品一区二区三区在线观看一| 国产日韩欧美电影| 在线视频综合导航| 另类小说色综合网站| 国产精品久久777777| 欧美喷潮久久久xxxxx| 国产一区二区三区免费看| 亚洲欧洲99久久| 日韩欧美成人激情| 99久久99久久精品免费看蜜桃| 午夜a成v人精品| 国产精品久久久久一区二区三区 | 777久久久精品| 国产一区在线视频| 一区二区三区中文在线观看| 2019国产精品| 欧美日韩午夜影院| 国产成人免费视频网站 | 日韩欧美中文字幕一区| www.在线成人| 国产酒店精品激情| 亚洲成国产人片在线观看| 中文字幕第一区综合| 日韩三级在线免费观看| 色综合天天做天天爱| 激情av综合网| 男人操女人的视频在线观看欧美| 亚洲日本在线视频观看| 日韩美女主播在线视频一区二区三区 | 欧美一级欧美一级在线播放| 91一区二区三区在线观看| 精东粉嫩av免费一区二区三区| 午夜精品久久久久影视| 亚洲欧洲日韩女同| 国产视频一区二区在线观看| 欧美一级搡bbbb搡bbbb| 欧美日韩国产综合一区二区| 日本精品视频一区二区| 国产a级毛片一区| 国产精品一区一区| 激情综合网激情| 免费欧美在线视频| 日韩精品色哟哟| 丝袜国产日韩另类美女| 亚洲在线观看免费视频| 亚洲欧美日韩国产中文在线| 自拍偷自拍亚洲精品播放| 欧美国产一区在线| 日本一区免费视频| 国产亚洲成aⅴ人片在线观看 | aaa亚洲精品一二三区| 韩国一区二区三区| 蜜桃精品视频在线观看| 美女视频黄久久| 看电影不卡的网站| 毛片基地黄久久久久久天堂| 美国一区二区三区在线播放| 久久国内精品视频| 久久99久久久欧美国产| 久久99精品国产91久久来源| 国内精品视频一区二区三区八戒| 国产乱人伦偷精品视频免下载| 久久国产精品72免费观看| 精品一区二区成人精品| 韩日欧美一区二区三区| 国产美女视频91| 成人免费高清视频| 99在线精品一区二区三区| 91色婷婷久久久久合中文| 91麻豆精品视频| 欧美日韩成人一区| 日韩欧美黄色影院| 久久久亚洲精华液精华液精华液| 国产精品欧美一级免费| 亚洲激情第一区| 五月婷婷综合激情| 久久精品国产99国产精品| 国产成人免费在线观看不卡| 91麻豆国产自产在线观看| 欧美日韩国产一二三| 精品国产欧美一区二区| 中文成人av在线| 亚洲综合久久av| 精品一区二区三区在线播放视频| 成人激情开心网| 欧美日韩情趣电影| 精品免费国产一区二区三区四区| 国产精品久久三| 婷婷综合久久一区二区三区| 国产做a爰片久久毛片| 色综合夜色一区| 久久日一线二线三线suv| 亚洲天堂福利av| 蜜臀va亚洲va欧美va天堂| 99久久精品国产导航| 欧美一卡二卡在线观看| 国产精品美女久久久久aⅴ国产馆| 亚洲成人777| 99久久精品免费精品国产| 日韩一本二本av| 亚洲精品国产视频| 黄页视频在线91| 欧美少妇bbb| 国产精品视频一区二区三区不卡| 亚洲成人精品一区二区| 国产91综合一区在线观看| 欧美乱熟臀69xxxxxx| 亚洲欧洲国产专区| 国产一区二区在线视频| 欧美日韩激情一区| 国产精品传媒视频| 麻豆国产欧美一区二区三区| 欧美亚洲国产一区二区三区 | 精品毛片乱码1区2区3区| 国产精品对白交换视频| 精品亚洲成a人| 9191成人精品久久| 亚洲欧美乱综合| 成人黄色777网| 久久久国产午夜精品| 日韩电影免费在线| 欧美日韩亚洲综合| 1区2区3区欧美| 成人精品高清在线| 日韩欧美国产高清| 午夜精品影院在线观看| 欧美亚洲日本一区| 亚洲精选视频在线| 99riav久久精品riav| 日本一区二区不卡视频| 国产美女精品在线| 日韩视频永久免费| 免费在线观看一区| 3atv在线一区二区三区| 亚洲aⅴ怡春院| 欧美日韩国产在线播放网站| 亚洲va欧美va人人爽| 色视频欧美一区二区三区| 国产精品理论片| bt欧美亚洲午夜电影天堂| 国产欧美日韩精品在线| 国产精品香蕉一区二区三区| 久久久综合精品| 国产乱码字幕精品高清av| 精品福利一二区| 国产精品一二三区| 久久久久久久久久久久久女国产乱 | 亚洲永久免费视频| 97精品国产97久久久久久久久久久久 | 精品国产区一区| 激情偷乱视频一区二区三区| 欧美v日韩v国产v| 久久99国产精品久久99果冻传媒| 亚洲精品在线电影| 国产福利精品一区二区| 国产精品久久久一本精品 | 日韩在线a电影| 欧美一区二区三区在线电影| 麻豆一区二区在线| 精品成人一区二区三区四区| 国产成人精品网址| 欧美激情中文不卡| 91丨九色丨尤物| 亚洲福利视频一区二区| 制服丝袜亚洲播放| 国产精品18久久久| 亚洲欧美日韩综合aⅴ视频| 欧美视频日韩视频在线观看| 激情久久五月天| 中文字幕中文字幕中文字幕亚洲无线| 99久久免费视频.com| 亚洲成人资源在线|