发信人: liangvy()
整理人: hahalee(1999-03-17 20:30:07), 站内信件
|
1。3FreeBSD boot之前的工作 1。3。1pc/at机器的boot顺序 hard disk的最前面的一个block(512byte),叫做master boot recorder(MBR).这 里有启动限定的program和分区的信息。分区信息是指对于一个区是16byte长,最多 只能有4个区。16byte的内容是,分区哪里开始,哪里结束。哪种os,能否启动等。对 于freebsd,安装的时候向MBR写入了boot easy. 磁盘的结构如下图表示: block Number #0 #1 #2 ... #14 #15 #16 #17 ------------------------------------------------------------- disk no used label ------------------------------------------------------------- <-boot->|<---------boot2-------------->| |<--unix file system--
FreeBSD用的block#0--#14的15个block里面,含有读入freebsd的程序,bootease 只在block#0里面,在15个block中并没有。它的作用 。读入mbr,找freebsd的分区 。读入最初的15个block,到物理内存中0x0001000 。跳转到相当于block#2的内存位置 然后,屏幕表示为: 。。。 。。。 boot: (参数说明略) 它的source是/usr/src/sys/i386/boot/biosboot,make之后,生成两个文件: boot1,boot2分别写入block#1,block#2--#14中。 一般,一个物理的unix分区理论上可以有8个,比如swap,unix system等。 boot2部分是boot program,它读入kernel的文件名和option。然后 。找boot label指定的分区。 。构造unix filesystem,找指定的kernel 。从开始执行文件,text,data的顺序向物理内存读入。对bss清零。 。以option的选择,向开始位置跳转。 1。3。2kernel的初始化动作 boot program执行之后,转向kernel的text段开始进行初始化,即先执行 locore.s的text段。因此是虚拟内存还没有发生作用,locore.s的开始部分必 须对offset进行补正。locore.s的作用是 。保存从boot program过来的option 。设定虚拟的stacker 。检测cpu的module 。对自己的bss空间进行0初始化 。为使虚拟内存工作,要保证最少的管理信息。然后是虚拟空间动作。 也就是,调用cpu有强的依赖关系的过程init386()(@i386/i386/machdep.c), 然后进行kernel内的管理信息初始化,i/o设备的登记,生成4个kernel process ,再调用main()(@kern/init_main.c)。当main()返回locore.s时,应该有如下 5个进程: PID TT STAT TIME COMMAND 0 ?? DLs 0:00.17 (swapper) 1 ?? Is 0:00.19 /sbin/init -- 2 ?? DL 0:56.60 (pagedaemon) 3 ?? DL 0:00.06 (vmdaemon) 4 ?? DL 6:07.65 (updata) 从locore.s返回到process #1,/sbin/init开始动作,然后转向freebsd的普通 动作。 init386()和main()的处理大致如下: 。init386() GDT和LDT,IDT,task stages处理的初始化,例外处理等locore.s没做的 事情,虚拟内存初始化。然后,根据boot program的参数,增加物理内 存page数。然后,作成process #0的雏形。 。main() 逐步调用构成kernel模块的的初始化部分。
-- ※ 来源:.网易 BBS bbs.netease.com.[FROM: www2.dt.sanyo.co.jp]
|
|