原始碼通常位於 /usr/src/linux/,採樹狀結構:
| 目錄 | 內容說明 |
|---|---|
arch/ | 架構相關程式碼,如 arch/x86/、arch/arm64/ |
include/ | 核心標頭檔,include/linux/ 為架構無關,include/asm-*/ 為架構相關 |
init/ | 核心初始化程式碼(main.c、version.c),研究啟動流程最佳切入點 |
mm/ | 記憶體管理(分頁、配置、釋放),架構相關部分在 arch/*/mm/ |
kernel/ | 核心心臟:排程器(sched.c)、訊號、時間、syscall 總控 |
drivers/ | 裝置驅動程式,依類型分子目錄(block/、char/、net/、gpu/ 等) |
fs/ | 檔案系統實作(ext4/、btrfs/、proc/、sysfs/ 等) |
net/ | 網路協定堆疊 |
ipc/ | 行程間通訊(訊號、共享記憶體、訊息佇列) |
lib/ | 核心共用函式庫 |
scripts/ | 建置腳本(Kconfig、Makefile 輔助) |
每目錄下通常含 Makefile、.depend(相依關係)、README(說明)。
arch/x86/boot/bootsect.S → arch/x86/kernel/setup.S → arch/x86/kernel/head.S(建立 IDT,含 system_call 入口) → init/main.c:start_kernel() → arch/x86/kernel/traps.c:trap_init() → set_system_gate(SYSCALL_VECTOR, &system_call) 將系統呼叫掛在中斷 0x80。arch/x86/kernel/entry.S 中的 system_call(組合語言)負責保存暫存器、驗證呼叫號、依 sys_call_table 跳轉對應服務例程、恢復暫存器返回用戶空間。include/asm-x86/unistd.h 定義 __NR_xxx 常數,對應 sys_call_table 索引。arch/x86/kernel/syscall_table.S(或 entry.S 內)陣列儲存各服務例程位址。include/uapi/asm-generic/unistd.h(或架構專屬 unistd.h)定義新呼叫號 __NR_mysyscall,並更新 __NR_syscalls 總數。kernel/sys_ni.c 或新檔 kernel/mysyscall.c 實作服務例程:asmlinkage long sys_mysyscall(int arg) { ... }arch/x86/entry/syscalls/syscall_64.tbl(x86_64)或 syscall_32.tbl 註冊:333 common mysyscall sys_mysyscallmake menuconfig → make -j$(nproc) → make modules_install installsyscall(__NR_mysyscall, arg) 或撰寫 wrapper 函式。syscall 指令(而非 int 0x80),入口為 entry_SYSCALL_64。cr0),不建議生產環境使用。ioctl、procfs、sysfs、netlink),避免新增系統呼叫。start_kernel()、sys_open()、tcp_v4_connect() 等具體功能函式。cscope、ctags、LXR(elixir.bootlin.com)、grep -r。struct task_struct、struct file、struct inode、struct socket 等核心物件。Documentation/ 目錄、函式標頭註解、kernel-doc 產生的手冊。printk、使用 ftrace/perf/kprobes 動態追蹤。