在 LDP (Linux Document Plane) 有一篇文章(
http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN245) The Linux Kernel Module Programming Guide有教學:
取得 目前安裝 的 kernel source code:
(後來發現不需要 source,只要header就可以 : ref )
$aptitude install linux-source
會 download 在 /usr/src/linux-source-2.6.31.19.tar.bz
然後把他就地解開 - 在 /usr/src
2.6 版的 driver module 要用 kernel source 的 kbuild 系統來 build。
所以要 build driver module,要download kernel source。
詳細的 build 方法在 kernel source code 的 Document\kbuild\modules.txt 有說明。
大概是說,Makefile 只要寫成:
obj-m += mymod.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
就可以
如果要 build '另一個 kernel source ' 的 driver module:
all:
make -C /home/checko/linux-2.6.32.19 M=$(PWD) modules
但是 自己目錄下的 linux-2.6.32.19 要 configure 好。
但是他還是會 complain 說沒有 configure 好,
ERROR: Kernel configuration is invalid.
include/linux/autoconf.h or include/config/auto.conf are missing.
Run 'make oldconfig && make prepare' on kernel src to fix it.
run 過 make oldconfig && make prepare 後,又說找不到 :
Building modules, stage 2.
MODPOST 1 modules
/bin/sh: scripts/mod/modpost: 沒有此一檔案或目錄
make[2]: *** [__modpost] Error 127
make[1]: *** [modules] Error 2
make[1]: Leaving directory `/home/checko/linux-2.6.32.9'
make: *** [all] Error 2
所以就要buld script 出來:
make scripts
這樣再 make module就 OK 了
到 /lib/modules/$(shell uname -r)/ 去看,可以看到 build link 到 /usr/src/linux-headers-$(shell uname -r)
.config 就在這個 folder 裡。
所以..實際上只需要 linux-header 就可以?
的確,有linux-header 就可以。不需要 linux-source
.config 也可以在 /boot 下找到,只是檔名變成 config-`uname -r`
make 完 install 的時候如果fail 可以 dmesg 出來看 eror message。
如果是:
no symbol version for module_layout
大概是你的 kernel source 和你的 running kernel 版本不一樣吧..
在 debian, ubuntu 下就要 apt-get update, upgrade 一下。
有關教學的補充:
cat 的 sample..
在 insmod 完後,用 dmesg 看一下取得的 Major number 是多少 (我的是251)。
然後用 mknod /dev/chardev c 251 0 建好 device node。
然後才可以用 cat /dev/chardev 呼叫到 device_read( ) function。