核心內部與作業系統建構

開機程序

當你按下電源鍵時,電腦無法直接開始執行你的作業系統——此時什麼都還沒載入、記憶體一片空白,而 CPU 只知道從一個固定位置取出一道指令。開機程序(boot sequence)就是一場精心安排的接力賽,把機器從冰冷的矽晶片帶到一個完整執行、出現登入畫面的作業系統。把它想成早上喚醒一座大工廠:先由一位可信的人打開大門,他開燈並檢查機器是否正常,接著叫醒一小組人,這一小組再叫醒更大的一組,最後整座工廠才運轉起來。每個階段都只懂得剛好足夠的事,去喚醒下一個更大的階段。

具體的階段如下。(1) CPU 開始執行燒在主機板晶片上的韌體(舊式 PC 是 BIOS,現代機器是 UEFI);它執行開機自我測試(POST)以檢查記憶體與裝置。(2) 韌體找到開機裝置,把控制權交給開機載入器(bootloader,例如 GRUB),這個小程式唯一的任務就是找到並載入作業系統。(3) 開機載入器把核心映像載入記憶體,必要時解壓縮,然後跳入其中執行。(4) 核心設定最基本的東西——自己的記憶體配置圖、中斷表、CPU 的保護模式——接著從 initramfs 掛載一個暫時的根檔案系統,好讓它擁有驅動程式去接觸真正的磁碟。(5) 最後核心啟動第一個使用者行程(init 或 systemd),由它再去啟動其餘所有服務,把你帶到一個可用的系統。

這之所以重要,是因為其他幾乎所有東西都預設核心已經在執行——開機正是這個前提還不成立的那一段,因此充滿了雞生蛋的難題(你需要驅動程式才能讀磁碟,但驅動程式卻在磁碟上)。一個常見的誤解是把開機載入器和核心當成同一個東西;它們是兩個獨立的程式,中間有一次交接,這正是為什麼你能有一個開機選單(GRUB),在任何一個真正執行之前先讓你挑選好幾個不同的核心或作業系統。

在一台 Linux 筆電上,這條鏈幾乎可以讀成一句話:UEFI 韌體 -> POST -> GRUB 顯示選單 -> GRUB 載入 vmlinuz(核心)與 initramfs -> 核心解壓縮、啟動 CPU 與記憶體、掛載 initramfs、載入磁碟驅動程式、掛載真正的根檔案系統 -> 核心執行 /sbin/init(systemd)作為第 1 號行程 -> systemd 啟動顯示管理員,你便看到登入畫面。

每個階段載入並信任下一個更大的階段——韌體、開機載入器、核心、init。

開機是一般作業系統保護尚未生效的場所之一,因此成為安全攻防的戰場:感染開機載入器的惡意軟體(bootkit)會在核心之前執行,並能藏過核心的偵測——這正是安全開機(secure boot)的動機,它在執行每個階段前先驗證其簽章。

又稱
boot processstartup sequence開機流程