2007年4月21日 星期六

如何在Linux 2.6的kernel上,編譯出module?

----先進行環境設定(以後可以略過這一步驟)
1.先安裝libncurses5-dev套件。
#>apt-get install libncurses5-dev
2.下載kernel source至/usr/src目錄中。
#>cd /usr/src
#>ftp ftp.kernel.org
username:anonymous
password:(void)
ftp> cd pub/linux/kernel/v2.6/
ftp> binary
ftp> get linux-2.6.xxxxx.tar.gz
ftp> bye
3.將kernel source解開。
#>tar xzvf linux-2.6.xxxxx.tar.gz
4.編譯kernel source。
#>cd linux-2.6.xxxxx
#>make menuconfig
#>make
4.做一個Symbolic Link的目錄
#>cd /lib/modules/2.6.xxxxx/
#>ln -s /usr/src/linux-2.6.xxxxx build

----撰寫及安裝程式
5.撰寫模組程式,別忘了下列兩個最基本的函式。
int init_module(void);
void cleanup_module(void);
.....
6.撰寫Makefile檔。(使用2.6版kernel source的編譯設定)
obj-m += xxxxx.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
7.編譯程式。
#>make
8.它將會產出xxxxx.ko(xxxxx.ko是Linux 2.6版模組預設的附檔名,在Linux 2.4版時是xxxxx.o)。
9.將其與Linux Kernel連結。
#>insmod xxxxx.ko
10.檢查其是否確實存在。
#>lsmod | grep --color "xxxxx"
11.將其移出Linux Kernel。
#>rmmod xxxxx

1 則留言:

Danny 提到...

提醒一下!
使用init_module( )與cleanup_module( )需要加入標頭檔:
#include "linux/modules.h"