系統啓動-以Linux爲例

這篇說一下計算機的啓動過程,主要是PC系統上Linux的啓動過程,嵌入式的稍微提到一下,這上面的東西不一定非常正確,大多從網上相關的技術文章中獲取的信息,以及查閱了部分Linux的代碼。

總的來說這個文章定位於學習交流的性質,如果您覺得有不對的地方請一定指出來。

正文開始:

系統復位完成後,CPU從一個確定的地址開始執行代碼,PC就是從BIOS中開始執行。嵌入式CPU則是在復位後從一個位於閃存或者ROM的已知地址處開始執行,具體這個地址在哪兒應該去查閱所使用CPU的datasheet,一般上面都有說明。

下面接着說PC,在PC中,是從地址0xFFFF0處開始執行的,這個地址正好在BIOS的地址範圍之內,這裏是一條跳轉指令,跳轉到BIOS真正的啓動代碼處(此處更具體的過程應該查閱PC相關的架構設計文檔,Intel那幾大本應該有用)。BIOS一開始是加電自檢,即所謂POST過程,POST過程完成後,其代碼就被清除出內存了,然後是BIOS的第二階段,這個階段進行本地設備的枚舉和初始化,這部分代碼在BIOS結束後仍然駐留內存,目標操作系統可以使用這些服務。BIOS最後會根據用戶的配置來查找活動分區,這裏以硬盤爲例。系統BIOS將讀取並執行硬盤上MBR處的代碼,這裏就進入了引導加載程序的部分,我們以當前大多數Linux發行版中使用的grub爲例來進行說明。由於BIOS訪問的存儲空間有限,所以大多把引導加載程序分成兩個階段來進行引導。

GRUB(GNU GRand Unified Bootloader)
MBR(Master Boot Record),一共512字節,位於磁盤的0道0柱面1扇區,即第一扇區。當MBR被加載到RAM後,BIOS將控制權交給了MBR,MBR中的主引導加載程序是一個512字節的映像,其中包含程序代碼和一個分區表。其中前446個字節是第一階段引導加載程序,其中包含了可執行代碼和錯誤消息文本,接下來64字節是分區表,其中包含4個分區的記錄(每個記錄大小爲16字節)。MBR以兩個特殊字節(0xAA55)結尾,用作MBR的有效性檢查。

第一階段引導加載程序的工作是查找並加載第二階段的引導程序,它通過在分區表中查找一個活動分區來實現這種功能,當找到一個活動分區的時候,它會掃描分區表中的其他分區,以確保它們是不活動的,當這個過程驗證完成後,就將活動分區的引導記錄從這個設備中讀入RAM並執行。

在這裏要提到一下,grub存在一個1.5階段,之所以存在這個階段是因爲在這裏grub可以識別文件系統,能夠訪問/boot/grub目錄下的配置文件,而不是訪問磁盤塊的方式,這個在啓動以後可以看一下/boot/grub目錄下面有許多文件系統格式+1.5這樣命名的文件,比如在我的機器上就有:
fat_stage1_5
jfs_stage1_5
minix_stage1_5
e2fs_stage1_5
reiserfs_stage1_5
xfs_stage1_5
可以看到這裏包含了Linux常用的多種文件系統。在grub1.5階段加載grub.conf之後,就可以看到啓動選項的界面了,這裏有許多可以配置的選項,鑑於本文的目的就不介紹了,可以參看grub的文檔說明。

當1.5引導加載程序加載運行以後,第二階段加載引導程序被加載到內存,並接管接下來的工作。它負責對文件系統進行查詢定位內核和initrd映像的位置,並將它們加載到內存中,當這些映像準備完畢,階段2引導加載程序調用內核入口函數,引導加載程序釋放控制權,內核階段開始。

一般內核是一個壓縮過的內核映像,在解壓縮之前,先有少量代碼進行一些硬件配置,然後解壓內核並將其放入到高端內存中,如果有initrd的話,會將它移到內存中,並表明以後可用,然後調用內核,開始啓動內核引導過程。具體過程一般是從arch/i386/boot/head.S的start彙編函數開始執行,這個函數執行一些基本硬件配置,然後調用arch/i386/boot/compressed/head.S中的startup_32函數,該函數然後調用decompress_kernel解壓內核,然後調用位於arch/i386/kernel/head.S中的startup_32函數,由它進一步初始化硬件,包括內存等,然後調用start_kernel,啓動內核,最後由start_kernel函數在最後調用init啓動第一個用戶空間進程,然後開始用戶空間的啓動過程,直到整個系統啓動完畢。

就先如此吧,下次可以將代碼更好的結合一下。

參考資料:
[1] http://en.wikipedia.org/wiki/BIOS
[2] http://www.ibm.com/developerworks/cn/linux/l-linuxboot/
[3] http://www.ibm.com/developerworks/cn/linux/l-bootload.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章