ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2010年3月16日 星期二

driver module for kernel 2.6

在 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。

沒有留言:

標籤

網誌存檔