boot2部分是boot program , 它读入kernel的文件名和option 。然后
。找boot label指定的分区 。
。构造unix filesystem , 找指定的kernel
。从开始执行文件 , text,data的顺序向物理内存读入 。对bss清零 。
。以option的选择 , 向开始位置跳转 。
1.3.2 kernel的初始化动作
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模块的的初始化部分 。
FreeBSD核心探讨(翻译)3
(续上 , liangvy.icewolf.leon翻译)
但是 , kernel构成的各个模块的初始化子程序一个个的列举出来运行很显然是
不行的 。通常是利用时间连表的技能来运行它(ld command) 。也就是 , 程序
是以很多个source分开编译和联结 。相同的模块名字就对应于相同的地址来进
行调用 。它在时间链表里面自动调节执行 。
初始化时候 , main()函数要call的模块利用在sys/kernel.h里面定义的宏
SYSINIT()和SYSINIT_KT()进行登记 。这样 , kernel在link的时候 , ld命令就
能够得到那些信息和进行配置列表 。这个列表就是kernel的组成模块的初始化
routine的登记 。检查source ,
就可以找到初始化routine的部分 。
如表:
print_CADdr_t(copyright) kern/init_main.c
vm_men_init(NULL) vm/vm_init.c
syctl_order(&sysctl_) kern/kern_sysctl.c
kmemnit(NULL) kern/kern_malloc.c
fpu_init(NULL) i386/i386/math_emulate.c
cpu_startup(NULL) i386/i386/machdep.c
gnufpu_init(NULL) miscfs/devfs/devfs_tree.c
...
各个device的major号与处理routine的登记 (major循序号)
...
configure(NULL) i386/i386/autoconf.c
proc0_init(NULL) kern/init_main.c
rqinit(NULL) kern/kern_synch.c
vm_init_limits(&proc0) vm/vm_glue.c
vfsinit(NULL) kern/vfs_init.c
elf_insert_brand_entry(&linux_brand) i386/linux/linux_sysvec.c
initclocks(NULL) kern/kern_clock.c
mbinit(NULL) kern/uipc_mbuf.c
clst_init(NULL) kern/tty_subr.c
shmnit(NULL) kern/sysv_shm.c
seminit(NULL) kern/sysv_sem.c
msginit(NULL) kern/sysc_msg.c
kludge_splimp(&x_save_spl) kern/uipc_domain.c
ifinit(NULL) net/if.c
domaininit(NULL) kern/uipc_domain.c
kludge_splx(&x_save_spl) kern/uipc_domain.c
kmstartup(NULL) kern/subr_prof.c
sched_setup(NULL) kern/init_main.c
xxx_vfs_mountroot(NULL) kern/init_main.c
xxx_vfs_root_fdtab(NULL) kern/init_main.c
swapinit(NULL) kern/init_main.c
proc0_post(NULL) kern/init_main.c
kthread_init(NULL) kern/init_main.c||
kproc_start(&page_kp) vm/vm_pageout.c||
kproc_start(&vm_kp) vm/vm_pageout.c||
推荐阅读
- Solaris 10:网络计算的开源核心平台
- 人参花的功效与作用人参花的禁忌人群
- Solaris10 SMF服务管理概要
- 红外线烤灯的功效与作用 红外线烤灯有什么作用
- 铁马鞭的功效与作用 铁马鞭的功效与作用是什么
- 鸡鸣散的功效与作用 鸡鸣散有什么功效
- 冬春多冻害果树早预防
- ZFS时代FreeBSD系统的数据冗余策略
- 玉米汁的功效与作用 玉米汁的禁忌
- 易筋经的功效与作用易筋经的好处