内核模块示例
#inlcude <linux/init.h>
#inlcude <linux/module.h> static int hello_init(){
printk(KERN_WARNING”hello_init\n”);
return ;
} static void hello_exit(){
printk(KERN_INFO”hello_exit\n”);
} module_init(hello_init);
module_exit(hello_exit);
特点:
内核模块代码没有main函数,内核模块的入口由module_init()指明。当使用insmod命令加载内核模块时,宏module_init()所指明的函数hello_init会得到调用。当使用rmmod命令卸载内核模块时,宏module_exit()所指明的函数hello_exit会被调用。内核模块包含<linux/init.h>和<linux/module.h>两个头文件。
编译内核模块
obj-m := hello.o
hello-objs = file1.o file2.o file3.o
KDIR := .../linux_kernel
all:
make –C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm –f *.o *.ko *.order *.symvers
说明:
1.目标文件
obj-m表示要生成的模块名,如果有多个文件生成一个模块,需要加上xxx-objs来指明依赖的文件。
2.内核路径
KDIR用来指明生成生成的内核模块依赖的内核代码。
3.编译规则
–C $(KDIR)表示进入依赖的内核文件,M=$(PWD)表示要编译的内核模块,modules ARCH=arm CROSS_COMPILE=arm-linux-表要编译的内核模块使用的处理器架构和交叉工具链。
hello.c
#include <linux/init.h>
#include <linux/module.h> //加载函数
static int hello_init(){
printk(KERN_WARNING"hello_init\n"); return ;
} //卸载函数
static void hello_exit(){
printk(KERN_WARNING"hello_exit\n");
} module_init(hello_init);
module_exit(hello_exit);
Makefile
obj-m := hello.o KDIR := /space/work/guoqian/liunxkernel//kernel/linux-mini2440 all :
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux- clean :
@rm -f *.o *.ko *.mod.* *.order *.symvers