$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。
沒有留言:
張貼留言