Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

從原始碼視角深度剖析Linux啟動流程

編輯:Linux 教學

以Red Hat 9.0 i386平台為例,從原始碼層面追蹤從通電到Shell提示符的完整啟動路徑,揭示核心初始化、用戶空間遷移、服務啟動、終端開啟、登入驗證的關鍵節點與代碼對應。

啟動階段劃分

  1. BIOS POST → 載入啟動裝置 MBR/GPT
  2. Bootloader (LILO/GRUB) → 載入核心映像
  3. 核心引導:arch/i386/boot/ → 解壓核心 → start_kernel()
  4. init 進程 (PID 1) → 讀取 /etc/inittab
  5. 系統初始化:/etc/rc.d/rc.sysinit → /etc/rc.d/rc N
  6. 終端建立:mingetty → login → Shell

核心引導關鍵代碼路徑

1. 實模式階段 (arch/i386/boot/)

  • bootsect.S:引導扇區,載入 setup.S。
  • setup.S:收集 BIOS 回傳參數 (記憶體圖、磁碟參數、顯示模式) → 複製至特定記憶體 → 切換保護模式 → 跳轉 0x100000。
  • video.S:偵測/設定顯示模式。

2. 核心解壓與進入點

  • 壓縮核心 vmlinuz 經 arch/i386/boot/compressed/head.S → misc.c::decompress_kernel() 解壓至 0x100000。
  • CPU 跳轉 0x100000 → arch/i386/kernel/head.S::startup_32 → init/main.c::start_kernel()。

3. start_kernel() 核心初始化總管

依序呼叫:

  • setup_arch():架構相關初始化 (分頁、中斷描述符表、CPU 偵測)。
  • mm_init():記憶體管理 (Slab、頁框分配器)。
  • sched_init():排程器初始化。
  • trap_init() / init_IRQ():中斷與異常處理。
  • time_init():時鍾源與 jiffies。
  • vfs_caches_init():VFS 快取 (inode、dentry)。
  • rest_init():建立 kernel_thread(kernel_init) (PID 1 祖先) → kernel_init 執行 do_basic_setup() (驅動模組載入、檔案系統掛載) → execve("/sbin/init") 進入用戶空間。

用戶空間初始化

/etc/inittab 關鍵行解讀


id:5:initdefault:              # 預設運行級別 5 (圖形)
si::sysinit:/etc/rc.d/rc.sysinit  # 系統初始化腳本 (單次)
l5:5:wait:/etc/rc.d/rc 5       # 級別 5 執行 rc 腳本
1:2345:respawn:/sbin/mingetty tty1  # 文字終端 1-6
x:5:respawn:/etc/X11/prefdm -nodaemon  # 圖形登入管理器
  • action:sysinit/wait/respawn/ctrlaltdel/initdefault 等。
  • runlevel:0-6, S/s。

/etc/rc.d/rc.sysinit 主要工作

  • 啟用 swap、檢查檔案系統 (fsck)。
  • 載入硬體模組 (/etc/modprobe.conf、/etc/sysconfig/modules/)。
  • 設定主機名、網路、時區、鍵盤映射。
  • 啟動 udev 裝置管理。

/etc/rc.d/rc N 服務啟動機制

  • 執行 /etc/rc.d/rcN.d/ 下 K* (停止) → S* (啟動) 符號連結。
  • 真實腳本位於 /etc/rc.d/init.d/,支援 start/stop/restart/status。
  • chkconfig / systemctl 管理連結。

終端與登入

  • mingetty 開啟 /dev/ttyN,顯示 login: 提示。
  • 輸入用戶名 → 傳遞 login 程式驗證。
  • login 檢查 /etc/nologin、/etc/securetty、/etc/passwd//etc/shadow。
  • 成功 → 顯示 lastlog、郵件提示 → 讀取 /etc/profile → ~/.bash_profile → ~/.bashrc → 環境變數就緒 → PS1 提示符出現。

圖形登入流程

  1. inittab 啟動 prefdm (GDM/KDM/LightDM/SDDM)。
  2. 顯示管理器驗證用戶 (PAM) → 建立 Session。
  3. 讀取 /etc/X11/xinit/xinitrc 或 ~/.xsession → 啟動 Window Manager (GNOME/KDE/Xfce/i3...)。

原始碼視角揭示:Linux啟動是核心自舉 → 用戶空間腳本編排 → 服務依賴拓撲 → 終端/圖形介面遞交的層層遞進過程。閱讀代碼比背誦流程圖更能建立系統性心智模型。

Copyright © Windows教程網 All Rights Reserved