


Linux從開機到登錄啟動過程綜述
Bootloader
在Alpha/AXP平臺上引導Linux通常有兩種方法,一種是由MILO及其他類似的引導程序引導,另一種是由Firmware直接引導。MILO功能與i386平臺的LILO相近,但內置有基本的磁盤驅動程序(如IDE、SCSI等),以及常見的文件系統驅動程序(如ext2,iso9660等), firmware有ARC、SRM兩種形式,ARC具有類BIOS界面,甚至還有多重引導的設置;而SRM則具有功能強大的命令行界面,用戶可以在控制臺上使用boot等命令引導系統。ARC有分區(Partition)的概念,因此可以訪問到分區的首扇區;而SRM只能將控制轉給磁盤的首扇區。兩種firmware都可以通過引導MILO來引導Linux,也可以直接引導Linux的引導代碼。
“arch/alpha/boot”下就是制作Linux Bootloader的文件。“head.S”文件提供了對 OSF PAL/1的調用入口,它將被編譯后置于引導扇區(ARC的分區首扇區或SRM的磁盤0扇區),得到控制后初始化一些數據結構,再將控制轉給“main.c”中的start_kernel(), start_kernel()向控制臺輸出一些提示,調用pal_init()初始化PAL代碼,調用openboot() 打開引導設備(通過讀取Firmware環境),調用load()將核心代碼加載到START_ADDR(見 “include/asm-alpha/system.h”),再將Firmware中的核心引導參數加載到ZERO_PAGE(0) 中,最后調用runkernel()將控制轉給0x100000的kernel,bootloader部分結束。
Bootloader中使用的所有“srm_”函數在“arch/alpha/lib/”中定義。
以上這種Boot方式是一種最簡單的方式,即不需其他工具就能引導Kernel,前提是按照 Makefile的指導,生成bootimage文件,內含以上提到的bootloader以及vmlinux,然后將 bootimage寫入自磁盤引導扇區始的位置中。
當采用MILO這樣的引導程序來引導Linux時,不需要上面所說的Bootloader,而只需要 vmlinux或vmlinux.gz,引導程序會主動解壓加載內核到0x1000(小內核)或0x100000(大內核),并直接進入內核引導部分,即本文的第二節。
對于I386平臺
i386系統中一般都有BIOS做最初的引導工作,那就是將四個主分區表中的第一個可引導分區的第一個扇區加載到實模式地址0x7c00上,然后將控制轉交給它。
在“arch/i386/boot”目錄下,bootsect.S是生成引導扇區的匯編源碼,它首先將自己拷貝到0x90000上,然后將緊接其后的setup部分(第二扇區)拷貝到0x90200,將真正的內核代碼拷貝到0x100000。以上這些拷貝動作都是以bootsect.S、setup.S以及vmlinux在磁盤上連續存放為前提的,也就是說,我們的bzImage文件或者zImage文件是按照bootsect,setup, vmlinux這樣的順序組織,并存放于始于引導分區的首扇區的連續磁盤扇區之中。
bootsect.S完成加載動作后,就直接跳轉到0x90200,這里正是setup.S的程序入口。 setup.S的主要功能就是將系統參數(包括內存、磁盤等,由BIOS返回)拷貝到 0x90000-0x901FF內存中,這個地方正是bootsect.S存放的地方,這時它將被系統參數覆蓋。以后這些參數將由保護模式下的代碼來讀取。
除此之外,setup.S還將video.S中的代碼包含進來,檢測和設置顯示器和顯示模式。最后,setup.S將系統轉換到保護模式,并跳轉到0x100000(對于bzImage格式的大內核是 0x100000,對于zImage格式的是0x1000)的內核引導代碼,Bootloader過程結束。
對于2.4.x版內核
沒有什么變化。
Kernel引導入口
對于I386平臺
在i386體系結構中,因為i386本身的問題,在"arch/alpha/kernel/head.S"中需要更多的設置,但最終也是通過call SYMBOL_NAME(start_kernel)轉到start_kernel()這個體系結構無關的函數中去執行了。
所不同的是,在i386系統中,當內核以bzImage的形式壓縮,即大內核方式(__BIG_KERNEL__)壓縮時就需要預先處理bootsect.S和setup.S,按照大核模式使用$(CPP) 處理生成bbootsect.S和bsetup.S,然后再編譯生成相應的.o文件,并使用 "arch/i386/boot/compressed/build.c"生成的build工具,將實際的內核(未壓縮的,含 kernel中的head.S代碼)與"arch/i386/boot/compressed"下的head.S和misc.c合成到一起,其中的head.S代替了"arch/i386/kernel/head.S"的位置,由Bootloader引導執行(startup_32入口),然后它調用misc.c中定義的decompress_kernel()函數,使用 "lib/inflate.c"中定義的gunzip()將內核解壓到0x100000,再轉到其上執行 "arch/i386/kernel/head.S"中的startup_32代碼。
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解