跳轉到內容

Linux 核心/啟動

來自華夏公益教科書,開放的書籍,用於開放的世界

當您啟動計算機時,核心會做什麼?在您啟動 GNU/Linux 系統時,登入螢幕出現之前會發生幾個主要步驟。按順序它們是

韌體/POST

[編輯 | 編輯原始碼]

您的計算機韌體/BIOS(基本輸入輸出系統)是一個小型計算機程式,當您的系統通電時,它的起始地址會被載入到計算機 CPU 的程式計數器暫存器中。韌體/POST(加電自檢)會對您的計算機系統執行一些基本的測試(通常是記憶體檢查,包括可能使用條紋記憶體篩查例程檢查您的記憶體,檢查您的系統上是否有鍵盤、滑鼠、硬碟驅動器等。然後,它會遍歷一個使用者定義的裝置列表,查詢一個名為引導載入程式的小程式。裝置列表可以是 CD-ROM、DVD 驅動器、硬碟驅動器等。當它找到引導載入程式時,它會將引導載入程式的起始地址載入到 CPU 的程式計數器暫存器中。

引導載入程式

[編輯 | 編輯原始碼]

Linux 引導載入程式可以是 LILO,或者現在更常見的是 GRUB。引導載入程式可能只有一個作業系統要啟動,或者它可能有多個,如果有多個,它會列出要載入的系統。作業系統不必是 GNU/Linux。

如果選擇了 GNU/Linux 作業系統,並且系統在 Intel X86/32 硬體上,那麼引導載入程式在“真實”x86 模式下執行(執行方式就像 CPU 是 8086 一樣),即使處理器可能是 Pentium 4/Celeron/Xeon。

引導載入程式的工作是重置所有 CPU 暫存器,將作業系統載入到記憶體中,並透過將起始地址載入到 CPU 的程式計數器中啟動它。由於 Intel 8086 無法支援超過 640k 的記憶體,而現代 Linux 核心大於 640k,因此使用特殊的跳轉指令(跳板)將壓縮的 Linux 核心(稱為 zImage)載入到記憶體中。

引導載入程式載入了幾個程式來幫助它完成這項工作,包括 setup.Ssystem

setup.S 負責從 BIOS 獲取系統資料,並將其放到系統記憶體中的適當位置。setup.S 向 BIOS 請求記憶體、磁碟和其他引數,並將自身和系統從載入它的低記憶體位置重新定位到一個“安全”位置:0x90000-0x901FF (INITSEG),即引導塊曾經存在的位置。然後,setup.S 在起始地址 0x10000 或 64K 處解壓縮壓縮的 (zImage) 核心映像,就在韌體資料空間 (SYSSEG) 之後。然後,它將解壓縮的核心從地址 0x10000 移動到地址 0x1000(4k,留下一個低記憶體頁面),從“真實”x86 模式切換到 emm386 模式,並將核心的起始地址載入到 CPU 的程式計數器暫存器中(啟動核心執行)。

setup.S 所做的最後一件事之一是執行影片設定和檢測程式碼,video.S。將核心在記憶體中來回移動是為了克服 PC BIOS 記憶體定址的限制(640k),並釋放數百 KB 的系統記憶體(實際釋放的記憶體量由系統報告)。4k 用於處理虛擬記憶體。特殊的載入指令(跳板)是用來“欺騙”系統的,因為這些指令將核心的一部分載入到超過 (當時正在執行的“真真實模式”) 系統知道的 640k 限制的記憶體位置。在將核心來回移動的過程中,BIOS 最初寫入的記憶體,以及 setup 和 system 程式被載入到的記憶體會被核心映像覆蓋,因此需要將它們移動到一個安全的地方,超出解壓縮核心映像被載入的地方。實際的載入在 x86 系統上稍微複雜一些,因為並非所有 BIOS 都在相同的暫存器上報告它們的記憶體,以不同的方式報告資訊,或者以非傳統的方式對映它們的記憶體/系統資源。此外,某些 BIOS 可能需要多次被提醒提供資訊,或者存在 A20 門問題。

其他計算機架構可能沒有 Intel x86 處理器的限制,因此載入 Linux 核心的方式要簡單得多。

華夏公益教科書