精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● FreeBSD>>FreeBSD 核心探讨 (cool!)>>FreeBSD核心探讨(翻译)2

主题:FreeBSD核心探讨(翻译)2
发信人: 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]

[关闭][返回]