Jump to...
redirecting...

Log for Ubuntu 台灣社群

[photo](media:AgACAgUAAx0CPRn5XQABAjO7aP238D3hkn5uNj7_yuo2MNaQ3LEAAj4MaxtpVelX8ZAZFoZFLmYBAAMCAANzAAM2BA@telegram)
Linux 的開機流程:從按下電源鍵到核心啟動 (★ 163 分)

文章以深入淺出的方式解釋 Linux 在按下電源鍵到核心 (kernel) 啟動之間的整個啟動流程。作者從實體層級開始說明:當電源穩定後,CPU 會回到最初的「實模式 (real mode)」,此模式源自 8086 晶片時代,記憶體位址是由「段 (segment)」與「偏移 (offset)」組成。CPU 執行第一條指令,從重置向量 (reset vector) 跳轉到主機板上韌體儲存的位置。接著介紹 BIOS(基本輸入輸出系統)與其現代替代方案 UEFI(統一可延伸韌體介面),前者透過啟動磁區載入啟動程式,後者則能直接存取檔案系統及提供更多啟動資訊,最終目的都是將控制權交給可以載入 Linux 的 bootloader。

接著作者說明 bootloader(例如 GRUB)如何將 Linux 核心載入記憶體。GRUB 除了顯示預設選單外,會填寫一份結構化資料(setup header),告訴核心重要位置如指令列參數、初始記憶碟 (initrd) 等,並跳入一段仍在實模式下運作的設定程式。該程式主要目的是建立穩定的環境:設定段暫存器 (CS、DS、SS)、清空方向旗標、建立堆疊 (stack)、清零 BSS 區域(全域變數的初始化區塊),並透過 e820 呼叫從韌體取得可用記憶體區域。之後會呼叫第一個 C 函式 `main`,準備離開實模式。

第二部分解釋從 16 位元實模式轉換到 32 位元保護模式 (protected mode),再到 64 位元長模式 (long mode) 的過程。保護模式引入全域描述表 (GDT) 與中斷描述表 (IDT) 以管理記憶體與中斷,Linux 簡化為「平面模型」,使記憶體位址呈線性。此階段會關閉所有中斷並開啟 A20 線以支援高於 1MB 的記憶體位址,設定控制暫存器 CR0 的 PE 位元進入保護模式,再建構分頁 (paging) 所需的基本頁表,使虛擬位址與實體位址相同 (identity mapping)。只要設定 CR4 的 PAE 位元並建立兩層或更多層頁表結構,再啟用 EFER 暫存器內的 LME 位元,就能切換到 64 位元長模式。

完成模式切換後,64 位元階段的啟動程式會解壓縮核心、修正位址並最終跳至真正的 Linux 核心。此程式先確認自己所在位置並避免與要解壓的核心重疊,設定最小中斷表以處理頁面錯誤與不可遮蔽中斷 (NMI)。接下來執行 `extract_kernel` 函式,依核心的執行檔格式 (ELF, Executable and Linkable Format) 將壓縮資料重新佈署到正確記憶體區段,若載入位置不同,則進行位置重定位 (relocation)。最後跳轉到 `start_kernel` 開始真正的初始作業。此外,文中也介紹了安全機制 kASLR(Kernel Address Space Layout Randomization,核心位址空間配置隨機化),用以在開機時隨機選擇核心在實體與虛擬記憶體的起始位址,降低記憶體攻擊的風險。

Hacker News 的討論相當熱烈,部分留言指出文章過於基礎,例如解釋十六進位與暫存器過於簡單,讓有經驗的讀者覺得「像寫給祖母看」,也有留言認為若再投入一點心力可更具深度,建議增補 TPM、安全開機 (Secure Boot)、ME 等現代機制;有人批評版面設計對桌面與手機使用者不夠友善,灰字白底對比太低,不易閱讀。另一方面,也有開發者肯定作者以清晰敘述呈現複雜主題,並呼籲更多低階技術內容重現網站首頁的「黑客精神」。

有讀者討論與補充 BIOS 與 UEFI 的差別,指出 UEFI 並非韌體本身,而是與韌體溝通的介面,現代 UEFI 啟動下其實不必走完整的 16 位元到 64 位元轉換流程。也有人分享非 x86 架構如 ARM 的啟動通常需經多層 bootloader,或提到 Raspberry Pi 採由 GPU 控制開機的獨特機制。部分評論懷念 Soekris 等純序列孔機器時代的簡潔設計,另有專業開發者指出 80286 實際進入的是「unreal mode」,強調歷史相容性如何形塑今日的啟動鏈。整體而言,社群普遍認為這篇文章雖屬入門級,但寫出從硬體到作業系統之間鮮少人願理清的過程,是近期難得結合教育與獨立精神的低階技術佳作。

👥 43 則討論、評論 💬
https://news.ycombinator.com/item?id=45707658