- 論壇徽章:
- 0
|
一、如何寫模塊
源碼
//------------------hello.c-------------------//
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int hello_init(void)
{
printk(KERN_ALERT "Hello World!\n"); //犯的錯誤:以為源程序漏了個逗號,其實就是沒有逗號,因為KERN_ALERT的宏定義是個字符串。
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Bye World!\n");
}
module_init(hello_init); //系統(tǒng)的。模塊初始化的
module_exit(hello_exit); //系統(tǒng)的,模塊卸載的
MODULE_LICENSE("GPL"); //license
MODULE_AUTHOR("Engelbert"); //作者署名
----------------------------------------------------------------------
二、模塊編譯
注意2.4版本和2.6版本差異很大
2.6版本要用如下Makefile
obj-m := hello.o
KDIR := /lib/modules/2.6.9-42.ELsmp/build #你機子上的linux版本的源代碼路徑
KERNELBUILD :=/lib/modules/`uname -r`/build
default:
make -C $(KDIR) M=$(shell pwd) modules
clean:
rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions
---------------------------------------------------------------------
編譯常見錯誤:No rule to make target `modules'
原因通常是:KDIR和KERNELBUILD設(shè)置的不對導(dǎo)致。
三、模塊加載
insmod ./hello.ko
常見錯誤:insmod: error inserting './hello.ko': -1 Invalid module format
--------
原因通常是:版本不對導(dǎo)致
查看具體錯誤信息,在
cat /var/log/messages |tail 或者用dmesg命令
里面有具體的原因。例如編譯時候用的內(nèi)核版本不對。這樣再回到編譯那步,確保KERNELBUILD、KDIR是和你要加載的是一樣內(nèi)核版本。
另外:
gcc版本不對,但是又不想再麻煩了。
使用modprobe 命令,這個命令 有-f 參數(shù)。
先 vi modules.dep
(這個文件在路徑 /lib/modules/2.6.9-42.ELsmp/ (和你的KDIR應(yīng)該一樣)下面 #同你機子上的linux版本的源代碼路徑)
最后加上一行:把hello.ko的全路徑加上: /mydir/hello.ko:
命令:
modprobe -f hello //強制加載了hello模塊,忽略了版本不對問題
modprobe -r hello //卸載了hello模塊
同時,通過 tail -f /var/log/messages ,
可以看到加載時輸出:Hello World!
卸載時輸出:Bye World! |
|