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 教學

核心原始碼目錄架構(以 2.6.x 為例)

原始碼通常位於 /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(說明)。

實戰:為核心新增一個系統呼叫

平台環境

  • 硬體:Intel Pentium II
  • OS:Red Hat Linux 6.0
  • 核心:2.2.5(範例版本,現代核心流程類似)

關鍵流程追蹤

  1. 啟動與初始化:
    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。
  2. 系統呼叫總控:
    arch/x86/kernel/entry.S 中的 system_call(組合語言)負責保存暫存器、驗證呼叫號、依 sys_call_table 跳轉對應服務例程、恢復暫存器返回用戶空間。
  3. 系統呼叫號定義:
    include/asm-x86/unistd.h 定義 __NR_xxx 常數,對應 sys_call_table 索引。
  4. 系統呼叫表:
    arch/x86/kernel/syscall_table.S(或 entry.S 內)陣列儲存各服務例程位址。

新增系統呼叫步驟(核心 2.6/3.x/4.x/5.x 通用原則)

  1. 在 include/uapi/asm-generic/unistd.h(或架構專屬 unistd.h)定義新呼叫號 __NR_mysyscall,並更新 __NR_syscalls 總數。
  2. 在 kernel/sys_ni.c 或新檔 kernel/mysyscall.c 實作服務例程:
    asmlinkage long sys_mysyscall(int arg) { ... }
  3. 在 arch/x86/entry/syscalls/syscall_64.tbl(x86_64)或 syscall_32.tbl 註冊:
    333 common mysyscall sys_mysyscall
  4. 重新編譯核心:
    make menuconfig → make -j$(nproc) → make modules_install install
  5. 重開機測試:
    用戶空間呼叫 syscall(__NR_mysyscall, arg) 或撰寫 wrapper 函式。

現代核心注意事項

  • x86_64 使用 syscall 指令(而非 int 0x80),入口為 entry_SYSCALL_64。
  • 系統呼叫表為唯讀記憶體,動態修改需關閉寫入保護(cr0),不建議生產環境使用。
  • 優先考慮擴充現有介面(ioctl、procfs、sysfs、netlink),避免新增系統呼叫。

閱讀核心原始碼的方法論

  1. 由入口點切入:start_kernel()、sys_open()、tcp_v4_connect() 等具體功能函式。
  2. 善用工具:cscope、ctags、LXR(elixir.bootlin.com)、grep -r。
  3. 追蹤資料結構:理解 struct task_struct、struct file、struct inode、struct socket 等核心物件。
  4. 閱讀註解與文檔:Documentation/ 目錄、函式標頭註解、kernel-doc 產生的手冊。
  5. 實驗驗證:加入 printk、使用 ftrace/perf/kprobes 動態追蹤。
Copyright © Windows教程網 All Rights Reserved