发信人: 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]
  | 
 
 
 |