一、如何写模块
源码
//------------------hello.c-------------------//
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include
#include
#include
static int hello_init(void)
{
printk(KERN_ALERT "Hello World!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Bye World!\n");
}
module_init(hello_init); //系统的。模块初始化的
module_exit(hello_exit); //系统的,模块卸载的
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设置的不对导致。
三、模块加载
insmod ./hello.ko
常见错误:insmod: error inserting './hello.ko': -1 Invalid module format
--------
原因通常是:版本不对导致
查看具体错误信息,在
cat /var/log/messages |tail 或者用dmesg命令
里面有具体的原因。例如编译时候用的内核版本不对。这样再回到编译那步,调整为正确的内核版本。
另外:
gcc版本不对,但是又不想再麻烦了。
使用modprobe 命令,这个命令 有-f 参数。
先 vi modules.dep
(在路径 KDIR := /lib/modules/2.6.9-42.ELsmp/下面 #同你机子上的linux版本的源代码路径)
最后加上一行:把hello.ko的全路径加上: /mydir/hello.ko:
命令:
modprobe -f hello //强制加载了hello模块,忽略了版本不对问题
modprobe -r hello //卸载了hello模块
同时,通过 tail -f /var/log/messages ,
可以看到加载时输出:Hello World!
卸载时输出:Bye World!
阅读(1369) | 评论(0) | 转发(0) |