理解 Linux 核心架構是驅動開發與系統移植的基石。本文以「飯店服務」類比說明驅動角色,系統介紹三層架構分工、核心原始碼目錄功能劃分、補丁製作與應用、五類 Makefile 階層關係,以及 make menuconfig 生成 .config 的完整流程。
| 層級 | 對應組件 | 飯店類比 | ARM 模式 |
|---|---|---|---|
| 應用層 | POSIX API、glibc、GUI 庫 | 客人透過服務台(API)提出需求 | User / System 模式 |
| 核心層 | 系統呼叫、VFS、記憶體管理、排程器、驅動 | 服務台派遣服務生(驅動)執行具體工作 | SVC (Supervisor) 模式 |
| 硬體層 | CPU、記憶體、外設控制器 | 廚房、客房、設施(實體資源) | - |


| 目錄 | 核心功能 |
|---|---|
| arch/ | CPU 架構相關程式碼(arm、x86、riscv…) |
| block/ | 區塊裝置 I/O 排程器 |
| drivers/ | 所有裝置驅動 |
| fs/ | 檔案系統實作 |
| include/ | 核心通用標頭檔 |
| init/ | 核心啟動流程(start_kernel) |
| ipc/ | 進程間通訊 |
| kernel/ | 核心核心:排程、信號、定時器 |
| mm/ | 記憶體管理 |
| net/ | 網路協議堆疊 |
| sound/ | 音訊子系統 |
驅動開發最常查閱:drivers/、include/linux/、arch/arm/、init/。
# 1. 產生補丁(舊→新)
diff -Naur linux-5.10/ linux-5.10.1/ > linux-5.10.1.patch
# 2. 應用補丁(在舊原始碼根目錄下)
cd linux-5.10
patch -p1 < ../linux-5.10.1.patch
# 3. 還原補丁
patch -R -p1 < ../linux-5.10.1.patch
注意:-p1 忽略第一層目錄前綴;補丁必須對應相同基準版本。
| 類型 | 位置 | 職責 |
|---|---|---|
| 總 Makefile | 核心根目錄 | 控制整體建置流程、架構選擇、子目錄遞迴 |
| 架構 Makefile | arch/$(ARCH)/Makefile | 定義架構專屬編譯選項、子目錄 |
| Kbuild 共用規則 | scripts/Makefile.* | 編譯/連結/模組打包通用規則 |
| 子目錄 Makefile (Kbuild) | 各功能目錄下 | 宣告 obj-y/m、ccflags-y 等 |
| .config | 根目錄 | 編譯時期配置變數來源 |
arch/$(ARCH)/Kconfig 為入口,遞迴 source 子目錄 Kconfig。[*] (內建)、[M] (模組)、[] (不編譯)。.config 與 include/config/auto.conf(去註釋版)。.config 變數決定編譯哪些 obj-y、obj-m。.o、.ko,最後連結生成 vmlinux → 壓縮為 bzImage。
config MY_FEATURE
bool "Enable My Feature"
depends on HAS_FOO
select BAR
default n
help
Detailed description...
depends on:相依符號為 y 才顯示/可選。select:選擇本項自動強制選擇目標符號。default:未使用者干預時的預設值。| 指令 | 用途 |
|---|---|
| make defconfig | 架構預設配置 |
| make menuconfig | 文字模式圖形選單 |
| make xconfig | Qt 圖形介面 |
| make gconfig | GTK 圖形介面 |
| make olddefconfig | 升級核心時保留舊配置、新增項用預設 |
| make savedefconfig | 輸出最小化 defconfig 供版控 |