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

📄 glue.cc

📁 南京航空航天大学开发的一个类Unix和Linux的操作系统,好不好看看就知道了,
💻 CC
字号:
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/mman.h>#include <assert.h>#include <string.h>#include <signal.h>#include "bootparam.h"#include "lib.h"void gluebootsect(char*);void gluesetup(char*);void gluekern(char*);char image[SECTSIZE + SETUPSIZE + MAXKERNSIZE];int imagesize;char * bootsect = image;char * setup = image + SECTSIZE;char * kcode = image + SECTSIZE + SETUPSIZE, * kdata;char * bootsectfile, * setupfile, * kernfile;bootparam_t * param = (bootparam_t*)(image + SECTSIZE + XBOOTPARAM);void sigsegv(int signo){	quit("glue receive SIGSEGV\n");}int main(int argc, char ** argv){	if (argc != 4)		quit("usage: glue bootsect setup kern\n");	signal(SIGSEGV, sigsegv);	gluebootsect(argv[1]);	gluesetup(argv[2]);	gluekern(argv[3]);	imagesize = SECTSIZE + SETUPSIZE + param->kernsize;	write(1, image, imagesize);	return 0;}void gluebootsect(char * file){	elfphdr_t * code, * data; 	bootsectfile = (char*) xmmap(file);	getelfphdr(bootsectfile, &code, &data);	assert(!code->vaddr && code->filesz <= SECTSIZE && !data->filesz);	memcpy(bootsect, bootsectfile + code->offset, code->filesz);}void gluesetup(char * file){	elfphdr_t * code, * data; 	setupfile = (char*) xmmap(file);	getelfphdr(setupfile, &code, &data);	assert(!code->vaddr && code->filesz <= SETUPSIZE && !data->filesz);	memcpy(setup, setupfile + code->offset, code->filesz);}#define KCODEVADDR (KERNSTART + KERNPA1)typedef unsigned long u32_t;void gluekern(char * file) /* not include the bss */{	elfphdr_t * code, * data;	u32_t * u32;	kernfile = (char*) xmmap(file);	getelfphdr(kernfile, &code, &data);	assert(code->vaddr == KCODEVADDR);	memcpy(kcode, kernfile + code->offset, code->filesz);	kdata = kcode + data->vaddr - code->vaddr;	memcpy(kdata, kernfile + data->offset, data->filesz);	param->kernsize = (data->vaddr + data->filesz - code->vaddr + SECTSIZE - 1) & ~(SECTSIZE - 1);	assert(param->kernsize < MAXKERNSIZE);	param->kernentry = ((elfhdr_t *)kernfile)->entry;	param->kerncksum = 0;	for (u32 = (u32_t*)kcode; u32 < (u32_t*)(kcode+param->kernsize); u32++)		param->kerncksum += *u32;	fprintf(stderr, "ksize = %d(sect) cksum = %x\n", 		param->kernsize/SECTSIZE, param->kerncksum);}

⌨️ 快捷键说明

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