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 裝置驅動第三版範例程式編譯實戰:從 Makefile 到核心模組測試

編輯:Linux 教學

《Linux Device Drivers, 3rd Edition》(LDD3)範例程式編譯是初學者常遇到的第一道坎。本文記錄作者從直接用 gcc 編譯失敗、到修正核心標頭路徑、編譯核心、安裝 kernel-devel 套件、成功建置 scull.ko 並驗證載入的完整踩坑過程,提供實用解決方案。

一、直接用 gcc 編譯失敗


$ gcc -O2 -DMODULE -D__KERNEL__ -c test.c

錯誤大量:缺少核心標頭、巨集定義、結構體宣告。核心模組必須在核心建置系統中編譯,不能單獨用 gcc。

二、Makefile 建置報錯


make -C /lib/modules/2.6.15-1.2054_FC5/build M=/myfile/examples/scull LDDINC=... modules
make: *** /lib/modules/2.6.15-1.2054_FC5/build: No such file or directory. Stop.

/lib/modules/$(uname -r)/build 應指向核心原始碼樹,但此處是斷開的符號連結。

三、根因:缺少 kernel-devel 套件

  • Fedora/RHEL/CentOS 預設不安裝核心開發套件
  • kernel-devel-$(uname -r).rpm 提供 /usr/src/kernels/$(uname -r)/ 完整標頭與建置腳本
  • /lib/modules/$(uname -r)/build 應連結至該目錄

四、解決方案

方法 1:安裝對應 kernel-devel(推薦)


# 下載對應版本 rpm
wget https://download.fedora.redhat.com/pub/fedora/linux/core/5/i386/os/Fedora/RPMS/kernel-devel-2.6.15-1.2054_FC5.i686.rpm
rpm -ivh kernel-devel-2.6.15-1.2054_FC5.i686.rpm
# 或安裝光碟內同版本套件

方法 2:手動編譯核心(若無對應 rpm)


# 下載核心原始碼
wget https://cdn.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.tar.gz
tar xzf linux-2.6.20.tar.gz -C /usr/src
cd /usr/src/linux-2.6.20
make menuconfig   # 載入現有 .config 或預設配置
make -j$(nproc)   # 編譯核心(耗時較久)
make modules_install
make install

編譯完成後 /lib/modules/2.6.15-1.2054_FC5/build 連結自動修復。

五、成功建置 scull.ko


$ cd /myfile/examples/scull
$ make
# 輸出顯示產生 scull.ko 等模組檔案

六、載入與驗證


$ insmod scull.ko
# 文字終端機可直接看到 printk 輸出
# X Window 終端機需查看 /var/log/messages
$ dmesg | tail
$ cat /var/log/messages | grep scull

七、Makefile 通用修改技巧

LDD3 提供的 Makefile 通用性極高,只需修改:


obj-m := your_module.o   # 將 scull 改為你的模組名稱

八、心得總結

  1. 核心模組編譯必須依賴核心建置系統(kernel-devel 或完整核心原始碼)
  2. insmod 載入後無輸出不代表失敗,需看 dmesg 或 /var/log/messages
  3. Makefile 通用性強,僅需修改 obj-m 即可複用
  4. 遇到問題優先檢查 /lib/modules/$(uname -r)/build 連結有效性
Copyright © Windows教程網 All Rights Reserved