1、linux 内核模块不被编译到内核文件(zImage,bzImage), 而是在运行期间动态的安装和卸载
2、内核模块包括一下几部分:主体部分设计,编译内核模块,安装卸载NHMK,可选项使用(模块申明,MK参数,符号输出)
3、简单例子:
hello.c:
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "hello_init
");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "goodbye,kernel!
");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("APOLLO"); //作者
MODULE_DESCRIPTION("This is a simple example
"); //模块描述
MODULE_ALIAS("A simple example"); //别名
Makefile:
obj-m:=hello.o
PWD := $(shell pwd)
KDIR:=/work/linux-3.0.1 //使用版本的内核代码位置,此处使用的是位于/work/linux-3.0.1中的内核代码
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.mod.c *.mod.o *.ko *.o *.tmp_versions *.order *symvers
注意:编写makefile时,不能使用初Tab键外的空格符
注意:在OK6410开发板上insmod hello.ko 时出现问题如下:
no symbol version for module_layout
解决方式:因为使用的内核代码中没有Module.symvers,所以要生成此文件
生成方式 $ cd lib/module/(内核使用版本)/build
$ make
可以发现Module.symvers生成
返回hello.c 文件所在目录
$ cd /work/hello
$ make
$ rm -rf /nfs/hello.ko (删除nfs中原有的hello.ko)
$ cp hello.ko /nfs
>>>进入OK6410 终端
# insmod hello.ko (模块加载完成)