日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

1 FreeBSD 核心( 三 )


boot2部分是boot program , 它讀入kernel的文件名和option 。然后
。找boot label指定的分區(qū) 。
。構(gòu)造unix filesystem , 找指定的kernel
。從開始執(zhí)行文件 , text,data的順序向物理內(nèi)存讀入 。對bss清零 。
。以option的選擇 , 向開始位置跳轉(zhuǎn) 。
1.3.2 kernel的初始化動(dòng)作
boot program執(zhí)行之后 , 轉(zhuǎn)向kernel的text段開始進(jìn)行初始化 , 即先執(zhí)行
locore.s的text段 。因此是虛擬內(nèi)存還沒有發(fā)生作用 , locore.s的開始部分必
須對offset進(jìn)行補(bǔ)正 。locore.s的作用是
。保存從boot program過來的option
。設(shè)定虛擬的stacker
。檢測cpu的module
。對自己的bss空間進(jìn)行0初始化
。為使虛擬內(nèi)存工作 , 要保證最少的管理信息 。然后是虛擬空間動(dòng)作 。
也就是 , 調(diào)用cpu有強(qiáng)的依賴關(guān)系的過程init386()(@i386/i386/machdep.c) ,
然后進(jìn)行kernel內(nèi)的管理信息初始化 , i/o設(shè)備的登記 , 生成4個(gè)kernel process
, 再調(diào)用main()(@kern/init_main.c) 。當(dāng)main()返回locore.s時(shí) , 應(yīng)該有如下
5個(gè)進(jìn)程:
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開始動(dòng)作 , 然后轉(zhuǎn)向freebsd的普通
動(dòng)作 。
init386()和main()的處理大致如下:
。init386()
GDT和LDT,IDT,task stages處理的初始化 , 例外處理等locore.s沒做的
事情 , 虛擬內(nèi)存初始化 。然后 , 根據(jù)boot program的參數(shù) , 增加物理內(nèi)
存page數(shù) 。然后 , 作成process #0的雛形 。
。main()
逐步調(diào)用構(gòu)成kernel模塊的的初始化部分 。


FreeBSD核心探討(翻譯)3

(續(xù)上 , liangvy.icewolf.leon翻譯)

但是 , kernel構(gòu)成的各個(gè)模塊的初始化子程序一個(gè)個(gè)的列舉出來運(yùn)行很顯然是
不行的 。通常是利用時(shí)間連表的技能來運(yùn)行它(ld command) 。也就是 , 程序
是以很多個(gè)source分開編譯和聯(lián)結(jié) 。相同的模塊名字就對應(yīng)于相同的地址來進(jìn)
行調(diào)用 。它在時(shí)間鏈表里面自動(dòng)調(diào)節(jié)執(zhí)行 。
初始化時(shí)候 , main()函數(shù)要call的模塊利用在sys/kernel.h里面定義的宏
SYSINIT()和SYSINIT_KT()進(jìn)行登記 。這樣 , kernel在link的時(shí)候 , ld命令就
能夠得到那些信息和進(jìn)行配置列表 。這個(gè)列表就是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
...
各個(gè)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||

推薦閱讀