萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 核心編譯關鍵指令詳解:depmod、System.map、符號表與 klogd 依賴關係

depmod -a:模組依賴關係生成器

執行時機:make modules_install 之後。

  • 掃描 /lib/modules/$(uname -r)/ 下所有 .ko 檔案。
  • 解析模組間符號依賴 (如 sd_mod 依賴 scsi_mod)。
  • 生成 modules.dep、modules.alias、modules.symbols、modules.builtin 等索引檔。
  • modprobe 依賴此索引自動解析載入順序。

注意:depmod -a 與編譯過程本身無關,屬於部署後處理,確保目標系統啟動時 modprobe 正常運作。

System.map:核心符號表地圖

生成方式


# 核心建構系統自動生成
nm vmlinux | grep -v '\(compiled\)\|\(\.o$\)\|\( [aUw] \)\|\(\..ng$\)\|\(LASH[RL]DI\)' | sort > System.map
# 複製至 /boot
cp System.map /boot/System.map-$(uname -r)

符號表內容

每行格式:address type symbol_name


c01000a5 T checkCPUtype
c0343f20 B BytesRead
ffffffff81000000 T startup_64
  • T/t:程式碼區符號 (text)
  • D/d:已初始化資料區
  • B/b:未初始化資料區 (BSS)
  • 大寫 = 全域符號,小寫 = 區域/靜態符號

為何需要 System.map?

用途說明
核心除錯 (Oops/panic)將堆疊追蹤位址轉為函數名,定位錯誤源頭
klogd (核心日誌守護進程)解析核心訊息中的位址為符號,輸出可讀日誌
lsof, ps, perf, systemtap解析核心位址顯示函數/變數名
專屬驅動模組極少數專有/舊式驅動需解析核心符號 (現代用 EXPORT_SYMBOL 機制)

klogd 尋找 System.map 順序

  1. /boot/System.map
  2. /System.map
  3. /usr/src/linux/System.map

支援版本智慧匹配:System.map-5.15.100 對應 5.15.100 核心。

版本管理鐵律

  • 每次編譯新核心必須生成新 System.map 並替換舊版。
  • 使用錯誤/缺失 System.map 導致:klogd 輸出無意義位址、除錯極度困難、部分驅動載入失敗。
  • /proc/ksyms (舊) / /proc/kallsyms (新) 為核心記憶體中即時符號表 (虛擬檔案,大小 0),不依賴磁碟檔案。

實務操作速查


# 查看當前核心符號
cat /proc/kallsyms | grep sys_write

# 手動生成 System.map (若遺失)
nm /boot/vmlinux-$(uname -r) | sort > /boot/System.map-$(uname -r)

# 驗證 klogd 能否解析
dmesg -T | head -20  # 應顯示函數名而非純位址
copyright © 萬盛學電腦網 all rights reserved