#define _LIBRARY_ //包含syscall0(),syscall1() #include<unistd.h> //标准符号常数和类型文件 #include<time.h> // /* *任务0的堆栈在以后会与任务1(代码段仍在内核空间)共享,因此在这之前不能弄乱任务0的堆栈; *因此我们调用fork()和pause()使用内嵌方式; *当再次执行fork()并执行过execve()后,被加载的程序已不属于内核空间,可以用写时复制了 */ static inline _syscall0(int,fork) //创建进程系统调用 static inline _syscall0(int,pause) //暂停进程的执行 static inline _syscall1(int,setup,woid *,BIOS) //仅用于Linux初始化 static inline _syscall0(int,sync) //更新文件系统 #include<linux/tty.h> //包含串行通信方面的参数和常数 #include<linux/sched.h> //调度程序头文件:任务结构、task0数据、嵌入式汇编(描述符) #include<linux/head.h> //描述符、选择符 #include<asm/system.h> //描述符、中断门 #include<asm/io.h> //IO口操作 #include<stddef.h> //标准定义头文件!--NULL,... #include<stdarg.h> //标准参数头文件!--va_start,va_arg... #include<unistd.h> //??? #include<fcntl.h> //文件控制 #include<sys/types.h> //基本系统数据结构 #include<linux/fs.h> //文件表结构 #include<string.h> //内存与字符串操作的嵌入式函数 static char printbuf[1024]; //内核显示信息专用静态空间 extern char *strcopy(); //??? extern int vsprintf(); extern void init(void); //??? extern void blk_dev_init(void); extern void chr_dev_init(void); extern void hd_init(void);//??? extern void floppy_init(void); extern void mem_init(long start,long end); extern long rd_init(long mem_start,int length); //因为兼容,所以12位和32位可同时出现 extern long kernel_mktime(struct tm *tm); //计算系统开机启动时间! //==============================================================================// /*现写现用*/ static int sprintf(char *str,const char *fmt,...) //??? { va_list args; int i; va_start(args,fmt); i=vsprintf(str,fmt,args); vs_end(args); return i; } #define EXT_MEM_K (*(unsigned short *)0x90002); //扩展内存大小,baseaddress > 1MB #define CON_ROWS ((*(unsigned short *)0x9000e)&0xff) #define CON_COLS (((*(unsigned short *)0x9000e)&0xff00)>>8) #define DRIVE_INFO (*(struct drive_info *)0x90080) #define ORIG_ROOT_DEV (*(unsigned short *)0x901fc) #define ORIG_SWAP_DEV (*(unsigned short *)0x901fa) #define CMOS_READ(addr) ({/ outb_p(0x80|addr,0x70);/ inb_p(0x71);/ }) #define BCD_TO_BIN(val) ((val)=((val)&15)+((val)>>4)*10) //15=0x0f static void time_init(void) { struct tm time; do{ time.tm_sec=CMOS_READ(0); time.tm_min=CMOS_READ(2); time.tm_hour=COMOS_READ(4); time.tm_mday=COMS_READ(7); time.tm_mon=COMS_READ(8); time.tm_year=COMS_READ(9); } while(time.tm_sec != COMS_READ(0)); BCD_TO_BIN(time.tm_sec); BCD_TO_BIN(time.tm_min); BCD_TO_BIN(time.tm_hour); BCD_TO_BIN(time.tm_mday); BCD_TO_BIN(time.tm_mon); BCD_TO_BIN(time.tm_year); time.tm_mon--; //0~11 startup_time=kernel_mktime(&time); //计算开机时间! } //局部变量 static long memory_end=0; //机器物理内存容量 static long buffer_memory_end=0; //高速缓冲区末端地址 static long main_memory_atart=0; //主内存开始处,与是否有虚拟盘有关 static char term[32]; //终端设置??? //------------------------------------------------------------------------------ static char *argv[]={"/bin/sh",NULL}; //若没有 * ,则是传递一些参数,有则是映射它们,更加高效! static char *envp[]={"HOME=/usr/root",NULL,NULL}; //???为什么是大括号,而不是read() static char *argv[]={"-/bin/sh",NULL}; //??? static char *envp[]={"HOME=/usr/root",NULL,NULL}; //------------------------------------------------------------------------------ struct drive_info {char dummy[32];} drive_info; //==============================================================================// /* *此时中断仍然被禁止着,做完必要的设置后会被开启 *保存setup程序获取的信息;设置init进程需要的环境变量 *内存区的设置 *初始化!!! *move_to_user_mode() *创建进程1,即init();此前的main在任务0的环境下运行 */ void main(void) { } //==============================================================================// static int printf(const char *fmt,...) { } //------------------------------------------------------------------------------ /* *初始化shell环境 *以登录shell的方式加载程序并执行之 *setup系统调用!! *读写方式打开设备--终端控制台 *打印缓冲区块和总字节数 *fork()创建子进程!! */ void init(void) { } //==============================================================================// /* *以后的改进 */