linux作業系統啟動之前,首先是硬體上電, BIOS,然後是主引導載入程式等。
我們從上電開始說起直到init進程。
啟動第一部分:從系統上電到進入linux作業系統。
第二部分:linux作業系統開始初始化到啟動init進程。
第一部分:
1.系統上電之後,會從0xffff,fff0處取指令。在0xffff,fff0地址處是一個跳轉指令,通過此指令,CPU跳轉到BIOS(位於ROM中)開始運行BIOS程式。
2.BIOS程式分兩個部分:其一主要做自檢工作,這個工作叫做POST(power on self test),這部分工作主要是檢查硬體,其中有顯卡,記憶體和系統匯流排,其中PCI的裝置枚舉過程就是在此完成的。例如沒有鍵盤的話,會在此檢查出來,並有提示。
2.1其一部分是:讀入“引導塊”。通過BIOS設定的引導順序(“引導順序”這個大家都很明白吧,就是從哪兒啟動,一般是硬碟啟動,安裝系統時從光碟片啟動),依次從硬碟,光碟片,軟碟機中讀入“引導塊”。此引導塊是第一扇區的512個位元組。一般來說都是從硬碟中讀出此“引導塊”並儲存到RAM中,此時CPU從BIOS跳轉到主引導載入程式。
3.主引導載入程式:
主引導載入程式的工作是尋找並載入次引導載入程式(第二階段)。它是通過在分區表中尋找一個使用中的磁碟分割來實現這種功能的。當找到一個使用中的磁碟分割時,它會掃描分區表中的其他分區,以確保它們都不是活動的。當這個過程驗證完成之後,就將使用中的磁碟分割的引導記錄從這個裝置中讀入 RAM 中並執行它。
4.次引導載入程式:
次引導載入程式(第二階段引導載入程式)可以更形象地稱為核心載入程式。這個階段的任務是載入 Linux 核心和可選的初始 RAM 磁碟。
在 x86 PC 環境中,第一階段和第二階段的引導載入程式一起稱為 Linux Loader(LILO)或 GRand Unified Bootloader(GRUB)。
5.啟動作業系統。(當然也可以是windows系統)
在此啟動的第一部分完成,開始運行作業系統,注意以上過程全部使用真實位址模式。
以硬碟啟動為例
1. 開機
2. BIOS 加電自檢 ( Power On Self Test -- POST ) 記憶體位址為 0FFFF : 0000
3. 將硬碟第一個扇區 (0頭0道[柱面]1扇區,也就是Boot Sector) 讀入記憶體位址0000 : 7C00 處.
4. 檢查(WORD) 0000 : 7DFE 是否等於0xAA55,若不等於則轉去嘗試其它啟動介質
如果沒有其它啟動介質則顯示"No ROM BASIC" 然後死機.
5. 跳轉到0000 : 7C00 處執行MBR 中的程式.
6. MBR 首先將自己複製到 0000 : 0600 處, 然後繼續執行.
7. 在主要磁碟分割表中搜尋標誌為活動的分區. 如果發現沒有使用中的磁碟分割或有不止一個使用中的磁碟分割, 則轉停止.
8. 將使用中的磁碟分割的第一個扇區讀入記憶體位址 0000 : 7C00 處.
9. 檢查(WORD) 0000 : 7DFE是否等於0xAA55,若不等於則顯示"Missing Operating System"然後停止,或嘗試磁碟片啟動
10. 跳轉到0000 : 7C00處繼續執行特定系統的啟動程式.
11. 啟動系統 ...
以上步驟中 2,3,4,5 步是由 BIOS 的引導程式完成. 6,7,8,9,10步由MBR中的引導程式完成.
更詳細的介紹:
http://www.ibm.com/developerworks/cn/linux/l-linuxboot/