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

FreeBSD操作系統(tǒng)的boot2階段

也許你想知道,為什么boot2是在boot0之后,而不是在boot1之后 。事實上,也有一個512字節(jié)的文件boot1存放在目錄/boot里,那是用來從一張軟盤引導(dǎo)系統(tǒng)的 。從軟盤引導(dǎo)時,boot1起著boot0對硬盤引導(dǎo)相同的作用:它找到boot2并運(yùn)行之 。
你可能已經(jīng)看到有一文件/boot/mbr 。這是boot0的簡化版本 。mbr中的代碼不會顯示菜單讓用戶選擇,而只是簡單的引導(dǎo)被標(biāo)志的分區(qū) 。
實現(xiàn)boot2的代碼存放在目錄sys/boot/i386/boot2/里,對應(yīng)的可執(zhí)行文件在/boot里 。在/boot里的文件boot0和boot2不會在引導(dǎo)過程中使用,只有boot0cfg這樣的工具才會使用它們 。boot0的內(nèi)容應(yīng)在MBR中才能生效 。boot2位于可引導(dǎo)的FreeBSD分區(qū)的開始 。這些位置不受文件系統(tǒng)控制,所以它們不可用ls之類的命令查看 。
boot2的主要任務(wù)是裝載文件/boot/loader,那是引導(dǎo)過程的第三階段 。在boot2中的代碼不能使用諸如open()和read()之類的例程函數(shù),因為內(nèi)核還沒有被加載 。而應(yīng)當(dāng)掃描硬盤,讀取文件系統(tǒng)結(jié)構(gòu),找到文件/boot/loader,用BIOS的功能將它讀入內(nèi)存,然后從其入口點開始執(zhí)行之 。
除此之外,boot2還可提示用戶進(jìn)行選擇,loader可以從其它磁盤、系統(tǒng)單元、分區(qū)裝載 。
boot2 的二進(jìn)制代碼用特殊的方式產(chǎn)生:
sys/boot/i386/boot2/Makefile
boot2: boot2.ldr boot2.bin ${BTX}/btx/btx
btxld -v -E ${ORG2} -f bin -b ${BTX}/btx/btx -l boot2.ldr
-o boot2.ld -P 1 boot2.bin這個Makefile片斷表明btxld(8)被用來鏈接二進(jìn)制代碼 。BTX表示引導(dǎo)擴(kuò)展器(BooT eXtender)是給程序(稱為客戶(clIEnt))提供保護(hù)模式環(huán)境、并與客戶程序相鏈接的一段代碼 。所以boot2是一個BTX客戶,使用BTX提供的服務(wù) 。
工具btxld是鏈接器,它將兩個二進(jìn)制代碼鏈接在一起 。btxld(8)和ld(1)的區(qū)別是ld通常將兩個目標(biāo)文件鏈接成一個動態(tài)鏈接庫或可執(zhí)行文件,而btxld則將一個目標(biāo)文件與BTX鏈接起來,產(chǎn)生適合于放在分區(qū)首部的二進(jìn)制代碼,以實現(xiàn)系統(tǒng)引導(dǎo) 。
boot0執(zhí)行跳轉(zhuǎn)至BTX的入口點 。然后,BTX將處理器切換至保護(hù)模式,并準(zhǔn)備一個簡單的環(huán)境,然后調(diào)用客戶 。這個環(huán)境包括:
虛擬8086模式 。這意味著BTX是虛擬8086的監(jiān)視程序 。實模式指令,如pushf, popf, cli, sti, if,均可被客戶調(diào)用 。
建立中斷描述符表(Interrupt Descriptor Table, IDT),使得所有的硬件中斷可被缺省的BIOS程序處理 。建立中斷0x30,這是系統(tǒng)調(diào)用關(guān)口 。
兩個系統(tǒng)調(diào)用exec和 exit的定義如下:
sys/boot/i386/btx/lib/btxsys.s:
.set INT_SYS,0x30# 中斷號
#
# System call: exit
#
__exit: xorl 陎,陎 # BTX系統(tǒng)調(diào)用0x0
int $INT_SYS#
#
# System call: exec
#
__exec: movl $0x1,陎 # BTX系統(tǒng)調(diào)用0x1
int $INT_SYS#
BTX建立全局描述符表(Global Descriptor Table, GDT):
sys/boot/i386/btx/btx/btx.s:
gdt:.Word 0x0,0x0,0x0,0x0# 以空為入口
.word 0xffff,0x0,0x9a00,0xcf# SEL_SCODE
.word 0xffff,0x0,0x9200,0xcf# SEL_SDATA
.word 0xffff,0x0,0x9a00,0x0 # SEL_RCODE
.word 0xffff,0x0,0x9200,0x0 # SEL_RDATA
.word 0xffff,MEM_USR,0xfa00,0xcf# SEL_UCODE
.word 0xffff,MEM_USR,0xf200,0xcf# SEL_UDATA
.word _TSSLM,MEM_TSS,0x8900,0x0 # SEL_TSS客戶的代碼和數(shù)據(jù)始于地址MEM_USR(0xa000),選擇符(selector) SEL_UCODE指向客戶的數(shù)據(jù)段 。選擇符 SEL_UCODE 擁有第3級描述符權(quán)限(Descriptor Privilege Level, DPL),這是最低級權(quán)限 。但是INT 0x30 指令的處理程序存儲于另一個段里,這個段的選擇符SEL_SCODE (supervisor code)由有著管理級權(quán)限 。正如代碼建立IDT(中斷描述符表)時進(jìn)行的操作那樣:
mov $SEL_SCODE,%dh # 段選擇符
init.2: shr %bx # 是否處理這個中斷?
jnc init.3 # 否

推薦閱讀