1、最简单的内核模块应该包含三个部分:
1)内核模块加载函数 函数定义 + 指定
2)内核模块卸载函数 函数定义 + 指定
3)对许可证的声明
#include <linux/init.h>
#include <linux/module.h>
//内核模块加载函数
static int __init hello_init(void)
{
printk(KERN_INFO "hello world enter\r\n");
return 0;
}
module_init(hello_init); //指定加载函数
//内核模块卸载函数
static void __exit hello_exit(void)
{
printk(KERN_INFO "hello world exit\r\n");
}
module_exit(hello_exit); //指定卸载函数
//许可证的声明,必须有
MODULE_LICENSE("GPL v2");
//别的描述性信息,非必须
MODULE_DESCRIPTION("hello world module"); //模块描述
MODULE_ALIAS("test module"); //模块别名
MODULE_AUTHOR("your name"); //作者信息
此外还有两部分可选
4)模块参数,即可以向模块传递一些参数,模块本身也可以设置默认参数
5)模块导出符号,类似于Window的DLL库,可以编写库函数为模块的形式提供给其他函数调用其变量或函数
2、Linux内核模块加载函数,需要以__init标识声明,模块加载函数有int类型返回值,加载正常返回0,加载异常返回负数
Linux内核模块卸载函数,需要以__exit标识声明,模块卸载函数没有返回值,是void型
3、相关命令
1)Linux中查看已加载的所有模块及模块间的依赖关系命令:
# lsmod //该命令实际是读取分析/proc/modules 文件
2)加载已编译好的.ko模块命令
#insmod xxx.ko //加载xxx.ko模块,该命令只加载该模块
或者
#modprobe xxx.ko //也是加载xxx.ko模块,该命令会一并加载xxx.ko模块所依赖的其他模块
注意:模块之间的依赖关系存放在根文件系统 /lib/modules/<kernel-version>/modules.dep文件中
3)卸载已加载的模块命令:
#rmmod xxx.ko //卸载已加载的xxx.ko模块
或者
#modprobe -r xxx.ko //卸载xxx.ko及其依赖模块
4)查看模块信息:
#modinfo xxx.ko //查看模块的信息,比如说明作者通行证参数等
4、其他
1) 内核已加载的模块信息也存在于 /sys/modules目录下,每加载一个xxx.ko,在该目录下就会生成一个xxx目录,在xxx目录下运行#tree -a 可得到该目录的目录树
2)printk是内核空间级别的打印函数
printf是用户空间级别的打印函数,
printk打印函数可以定义输出级别,是最基本的内核调试手段。
printk函数所打印的信息全部输出在 /var/log/messages 日志文件中