1.3 FreeBSD boot之前的工作
UVTLinux联盟1.3.1pc/at机器的boot顺序
UVTLinux联盟hard disk的最前面的一个block(512byte),叫做master boot recorder(MBR).这
UVTLinux联盟里有启动限定的program和分区的信息。分区信息是指对于一个区是16byte长,最多
UVTLinux联盟只能有4个区。16byte的内容是,分区哪里开始,哪里结束。哪种os,能否启动等。对
UVTLinux联盟于freebsd,安装的时候向MBR写入了boot easy.
UVTLinux联盟磁盘的结构如下图表示:
UVTLinux联盟block Number
UVTLinux联盟#0 #1 #2 ... #14 #15 #16 #17
UVTLinux联盟-------------------------------------------------------------
UVTLinux联盟disk no used
UVTLinux联盟label
UVTLinux联盟-------------------------------------------------------------
UVTLinux联盟<-boot->|<---------boot2-------------->| |<--unix file system--
UVTLinux联盟UVTLinux联盟FreeBSD用的block#0--#14的15个block里面,含有读入freebsd的程序,bootease
UVTLinux联盟只在block#0里面,在15个block中并没有。它的作用
UVTLinux联盟。读入mbr,找freebsd的分区
UVTLinux联盟。读入最初的15个block,到物理内存中0x0001000
UVTLinux联盟。跳转到相当于block#2的内存位置
UVTLinux联盟然后,屏幕表示为:
UVTLinux联盟。。。
UVTLinux联盟。。。
UVTLinux联盟boot:
UVTLinux联盟(参数说明略)
UVTLinux联盟它的source是/usr/src/sys/i386/boot/biosboot,make之后,生成两个文件:
UVTLinux联盟boot1,boot2分别写入block#1,block#2--#14中。
UVTLinux联盟一般,一个物理的unix分区理论上可以有8个,比如swap,unix system等。
UVTLinux联盟boot2部分是boot program,它读入kernel的文件名和option。然后
UVTLinux联盟。找boot label指定的分区。
UVTLinux联盟。构造unix filesystem,找指定的kernel
UVTLinux联盟。从开始执行文件,text,data的顺序向物理内存读入。对bss清零。
UVTLinux联盟。以option的选择,向开始位置跳转。
UVTLinux联盟1.3.2 kernel的初始化动作
UVTLinux联盟boot program执行之后,转向kernel的text段开始进行初始化,即先执行
UVTLinux联盟locore.s的text段。因此是虚拟内存还没有发生作用,locore.s的开始部分必
UVTLinux联盟须对offset进行补正。locore.s的作用是
UVTLinux联盟。保存从boot program过来的option
UVTLinux联盟。设定虚拟的stacker
UVTLinux联盟。检测cpu的module
UVTLinux联盟。对自己的bss空间进行0初始化
UVTLinux联盟。为使虚拟内存工作,要保证最少的管理信息。然后是虚拟空间动作。
UVTLinux联盟也就是,调用cpu有强的依赖关系的过程init386()(@i386/i386/machdep.c),
UVTLinux联盟然后进行kernel内的管理信息初始化,i/o设备的登记,生成4个kernel process
UVTLinux联盟,再调用main()(@kern/init_main.c)。当main()返回locore.s时,应该有如下
UVTLinux联盟5个进程:
UVTLinux联盟PID TT STAT TIME COMMAND
UVTLinux联盟0 ?? DLs 0:00.17 (swapper)
UVTLinux联盟1 ?? Is 0:00.19 /sbin/init --
UVTLinux联盟2 ?? DL 0:56.60 (pagedaemon)
UVTLinux联盟3 ?? DL 0:00.06 (vmdaemon)
UVTLinux联盟4 ?? DL 6:07.65 (updata)
UVTLinux联盟从locore.s返回到process #1,/sbin/init开始动作,然后转向freebsd的普通
UVTLinux联盟动作。
UVTLinux联盟init386()和main()的处理大致如下:
UVTLinux联盟。init386()
UVTLinux联盟GDT和LDT,IDT,task stages处理的初始化,例外处理等locore.s没做的
UVTLinux联盟事情,虚拟内存初始化。然后,根据boot program的参数,增加物理内
UVTLinux联盟存page数。然后,作成process #0的雏形。
UVTLinux联盟。main()
UVTLinux联盟逐步调用构成kernel模块的的初始化部分。
UVTLinux联盟UVTLinux联盟UVTLinux联盟FreeBSD核心探讨(翻译)3
UVTLinux联盟UVTLinux联盟(续上,liangvy.icewolf.leon翻译)
UVTLinux联盟UVTLinux联盟但是,kernel构成的各个模块的初始化子程序一个个的列举出来运行很显然是
UVTLinux联盟不行的。通常是利用时间连表的技能来运行它(ld command)。也就是,程序
UVTLinux联盟是以很多个source分开编译和联结。相同的模块名字就对应于相同的地址来进
UVTLinux联盟行调用。它在时间链表里面自动调节执行。
UVTLinux联盟初始化时候,main()函数要call的模块利用在sys/kernel.h里面定义的宏
UVTLinux联盟SYSINIT()和SYSINIT_KT()进行登记。这样,kernel在link的时候,ld命令就
UVTLinux联盟能够得到那些信息和进行配置列表。这个列表就是kernel的组成模块的初始化
UVTLinux联盟routine的登记。检查source,
UVTLinux联盟就可以找到初始化routine的部分。
UVTLinux联盟如表:
UVTLinux联盟print_caddr_t(copyright) kern/init_main.c
UVTLinux联盟vm_men_init(NULL) vm/vm_init.c
UVTLinux联盟syctl_order(&sysctl_) kern/kern_sysctl.c
UVTLinux联盟kmemnit(NULL) kern/kern_malloc.c
UVTLinux联盟fpu_init(NULL) i386/i386/math_emulate.c
UVTLinux联盟cpu_startup(NULL) i386/i386/machdep.c
UVTLinux联盟gnufpu_init(NULL) miscfs/devfs/devfs_tree.c
UVTLinux联盟...
UVTLinux联盟各个device的major号与处理routine的登记 (major循序号)
UVTLinux联盟...
UVTLinux联盟configure(NULL) i386/i386/autoconf.c
UVTLinux联盟proc0_init(NULL) kern/init_main.c
UVTLinux联盟rqinit(NULL) kern/kern_synch.c
UVTLinux联盟vm_init_limits(&proc0) vm/vm_glue.c
UVTLinux联盟vfsinit(NULL) kern/vfs_init.
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站
Linux论坛讨论