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

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


mov %ax,(%di)# 設(shè)置處理程序偏移量
mov %dh,0x2(%di)# 設(shè)置處理程序選擇符
mov %dl,0x5(%di)# 設(shè)置 P:DPL:type
add $0x4,%ax# 下一個中斷處理程序所以,當(dāng)客戶調(diào)用 __exec()時,代碼將被以最高權(quán)限執(zhí)行 。這使得內(nèi)核可以修改保護模式數(shù)據(jù)結(jié)構(gòu),如分頁表(page tables)、全局描述符表(GDT)、中斷描述符表(IDT)等 。
boot2 定義了一個重要的數(shù)據(jù)結(jié)構(gòu):struct bootinfo 。這個結(jié)構(gòu)由 boot2 初始化,然后被轉(zhuǎn)送到loader,之后又被轉(zhuǎn)入內(nèi)核 。這個結(jié)構(gòu)的部分項目由boot2設(shè)定,其余的由loader設(shè)定 。這個結(jié)構(gòu)中的信息包括內(nèi)核文件名、BIOS提供的硬盤柱面/磁頭/扇區(qū)數(shù)目信息、BIOS提供的引導(dǎo)設(shè)備的驅(qū)動器編號,可用的物理內(nèi)存大小,envp指針(環(huán)境指針)等 。定義如下:
/usr/include/Machine/bootinfo.h
struct bootinfo {
u_int32_tbi_version;
u_int32_tbi_kernelname; /* 用一個字節(jié)表示 * */
u_int32_tbi_nfs_diskless;/* struct nfs_diskless * */
/* 以上為常備項 */
#define bi_endcommonbi_n_bios_used
u_int32_tbi_n_bios_used;
u_int32_tbi_bios_geom[N_BIOS_GEOM];
u_int32_tbi_size;
u_int8_tbi_memsizes_valid;
u_int8_tbi_bios_dev;/* 引導(dǎo)設(shè)備的BIOS單元編號 */
u_int8_tbi_pad[2];
u_int32_tbi_basemem;
u_int32_tbi_extmem;
u_int32_tbi_symtab; /* struct symtab * */
u_int32_tbi_esymtab; /* struct symtab * */
/* 以下項目僅高級bootloader提供 */
u_int32_tbi_kernend; /* 內(nèi)核空間末端 */
u_int32_tbi_envp;/* 環(huán)境 */
u_int32_tbi_modulep; /* 預(yù)裝載的模塊 */
};boot2 進入一個循環(huán)等待用戶輸入,然后調(diào)用load() 。如果用戶不做任何輸入,循環(huán)將在一段時間后結(jié)束,load() 將會裝載缺省文件(/boot/loader) 。函數(shù) ino_t lookup(char *filename)和int xfsread(ino_t inode, void *buf, size_t nbyte) 用來將文件內(nèi)容讀入內(nèi)存 。/boot/loader是一個ELF格式二進制文件,不過它的頭部被換成了a.out格式中的struct exec結(jié)構(gòu) 。load()掃描loader的ELF頭部,裝載/boot/loader至內(nèi)存,然后跳轉(zhuǎn)至入口執(zhí)行之:
【FreeBSD操作系統(tǒng)的boot2階段】sys/boot/i386/boot2/boot2.c:
__exec((CADdr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),
MAKEBOOTDEV(dev_maj[dsk.type], 0, dsk.slice, dsk.unit, dsk.part),
0, 0, 0, VTOP(&bootinfo));

推薦閱讀