以Red Hat 9.0 i386平台為例,從原始碼層面追蹤從通電到Shell提示符的完整啟動路徑,揭示核心初始化、用戶空間遷移、服務啟動、終端開啟、登入驗證的關鍵節點與代碼對應。
arch/i386/boot/ → 解壓核心 → start_kernel()/etc/inittab/etc/rc.d/rc.sysinit → /etc/rc.d/rc Nmingetty → login → Shellarch/i386/boot/)bootsect.S:引導扇區,載入 setup.S。setup.S:收集 BIOS 回傳參數 (記憶體圖、磁碟參數、顯示模式) → 複製至特定記憶體 → 切換保護模式 → 跳轉 0x100000。video.S:偵測/設定顯示模式。vmlinuz 經 arch/i386/boot/compressed/head.S → misc.c::decompress_kernel() 解壓至 0x100000。0x100000 → arch/i386/kernel/head.S::startup_32 → init/main.c::start_kernel()。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 主要工作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 提示符出現。inittab 啟動 prefdm (GDM/KDM/LightDM/SDDM)。/etc/X11/xinit/xinitrc 或 ~/.xsession → 啟動 Window Manager (GNOME/KDE/Xfce/i3...)。原始碼視角揭示:Linux啟動是核心自舉 → 用戶空間腳本編排 → 服務依賴拓撲 → 終端/圖形介面遞交的層層遞進過程。閱讀代碼比背誦流程圖更能建立系統性心智模型。