首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux 核心啟動為何分兩階段:硬體初始化與作業系統初始化分離

     編輯:程式設計綜合問答

兩階段架構

  1. 第一階段:Bootloader (GRUB/U-Boot/BIOS/UEFI)
    • 硬體初始化:CPU 模式切換、記憶體控制器、時鐘、外設掃描。
    • 載入核心映像 (vmlinuz/Image) 到記憶體指定位址。
    • 載入 initramfs/initrd (初始根檔案系統)。
    • 跳轉進入核心進入點 start_kernel。
  2. 第二階段:Linux Kernel 初始化
    • 核心子系統啟動:記憶體管理、行程調度、VFS、驅動模型。
    • 掛載真實根檔案系統 (pivot_root / switch_root)。
    • 啟動 init (PID 1, systemd/SysVinit)。
    • 用戶空間服務啟動。

為什麼不合併?

1. 硬體抽象層分離

Bootloader 只需知道**「如何啟動這塊硬體」**,不需知道 Linux 核心內部結構。核心只需知道**「硬體已就緒,我接手管理」**。

2. 硬體多樣性爆炸

x86、ARM、RISC-V、MIPS... 每種架構、每塊開發板的啟動流程、記憶體佈局、外設樹皆不同。若核心包含所有啟動邏輯:

  • 核心體積暴漲、編譯配置極複雜。
  • 新硬體上市需重新編譯/發布核心 — **不可能維護**。

Bootloader (U-Boot/GRUB/EDK2) 專責處理平台差異,提供**統一啟動介面**給核心。

3. 彈性與模組化

  • 同一核心可在不同 Bootloader 啟動 (QEMU、實體板、雲端虛擬機)。
  • 支援多重啟動 (Windows/Linux/BSD 共存),Bootloader 選單決定載入哪個核心。
  • initramfs 可攜帶偵測硬體、載入驅動的腳本,核心本體保持精簡。

4. 安全性與信任鏈

  • UEFI Secure Boot → 驗證 Bootloader 簽名 → Bootloader 驗證核心簽名 → 核心驗證模組簽名。**分層驗證**,單點失效不影響整體。
  • TPM 量度啟動過程各階段雜湊值,遠端認證完整性。

類比

**Bootloader = 建築地基與骨架** (因地制宜,支撐上層)。
**Kernel = 智慧型建築管理系統** (標準化、可攜遷、負責日常運營)。

分離硬體初始化與作業系統初始化,是支撐 Linux 跨架構、跨平台、長期演進的關鍵架構決策。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved