linux 最小内核模块
1.内核模块介绍
linux内核包含的内容很多,在进行内核编译的时候,可以把所有的代码编译进内核,但是这样会引起两个问题:一是内核过大;二是 当需要添加或者删除内核时,需要重新再编译内核。而模块不需要编译到内核,放置到指定目录使用时直接加载模块,不需要使用时直接卸载模块,可以减小内核大小,并可以实现相同的效果。
2.最小linux模块例程
#include <linux/module.h>//与module相关的信息
#include <linux/kernel.h>
#include <linux/init.h> //与init相关的函数
MODULE_LICENSE("Dul BSD/GPL");
MODULE_AUTHOR("zhangsan");
static int hellodriver_init()
{
printk(KERN_INFO "Hello_init\n");
return 0;
}
static void hellodriver_exit()
{
printk(KERN_INFO "Hello_exit\n");
}
module_init(hellodriver_init);
module_exit(hellodriver_exit);
3.最小模块程序说明
(1)声明
MODULE_LICENSE("Dul BSD/GPL");
//模块的许可说明,这一句代码声明你遵循 GPL 协议,否则模块
在加载的时候,内核会提示被污染的“警报
在 Linux 内核模块领域,可接受的 LICENSE 参数
包括“GPL”、“GPL v2”、"GPL and addtional" 、
"Dual BSD/GPL"、"Dual MPL/GPL" 等,当参数是前面
的几个时,那么就表明你遵循 GPL 协议
MODULE_AUTHOR("zhangsan");
//模块作者说明,非必须
(2)模块入口和出口
module_init(hellodriver_init);
module_exit(hellodriver_exit);
(3)printk打印说明
printk用于内核消息打印,类似于printf函数
printk函数的优先级 定义于/kernel.h头文件中
#define KERN_EMERG"<0>"/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/
#define KERN_ALERT"<1>"/*报告消息,表示必须立即采取措施*/
#define KERN_CRIT"<2>"/*临界条件,通常涉及严重的硬件或软件操作失败*/
#define KERN_ERR"<3>"/*错误条件,驱动程序常用KERN_ERR来报告硬件的错误*/
#define KERN_WARNING"<4>"/*警告条件,对可能出现问题的情况进行警告*/
#define KERN_NOTICE"<5>"/*正常但又重要的条件,用于提醒。
常用于与安全相关的消息*/
#define KERN_INFO"<6>"/*提示信息,如驱动程序启动时,打印硬件信息*/
#define KERN_DEBUG"<7>"/*调试级别的消息*/
4.Makefile文件
obj-m := mini_driver_helloworld.o
//编译生成的中间文件
KDIR :=/home/usr/iTop4412_Kernel_3.0
//内核源码路径 与实际存放的位置对应
PWD := $(shell pwd)
//当前目录地址
all:
make -C $(KDIR) M=$(PWD) modules
//执行编译生成模块操作
clean:
rm -rf *.o
//执行删除操作
5.模块相关操作命令
1) insmod: 将模块插入内核中,使用方法:#insmod XXX.ko
2) rmmod: 将模块从内核中删除,使用方法:#rmmod XXX.ko
3) lsmod: 列表显示所有的内核模块,可以和grep指令结合使用。
使用方法:#lsmod | grep XXX
4) modprobe: modprobe可载入指定的个别模块,或是载入一组相
依赖的模块。modprobe会根据depmod所产生的依赖关系,决定要载入
哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。
依赖关系是通过读取 /lib/modules/2.6.xx/modules.dep得到的。
而该文件是通过depmod 所建立。
5) modinfo: 查看模块信息。使用方法:#modinfo XXX.ko
6) tree –a: 查看当前目录的整个树结构。使用方法:#tree -a