Linux 版 (精华区)

发信人: tcpip (俺的昵称改了), 信区: Linux
标  题: FreeBSD核心探讨(翻译)2(转寄)
发信站: 哈工大紫丁香 (Tue Aug 24 16:38:24 1999), 转信

发信人: reden (Offer 快快来啊 ~!), 信区: FreeBSD       

标  题: FreeBSD核心探讨(翻译)2

发信站: BBS 水木清华站 (Mon Mar 29 19:45:04 1999)

标 题: FreeBSD核心探讨(翻译)2 

  

  作 者: liangvy (桃花岛主) 1999.03.15

  

  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.net.tsinghua.edu.cn·[FROM: 159.226.21

.168]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.887毫秒