【1】linux内核模块
可在运行的时候添加到内核中的代码称为模块
【2】模块和应用程序的区别
应用程序 模块
1. 运行空间 用户空间 内核空间
2. 入口函数 main 加载函数
3. 库 usr/lib/标准库 内核源码
4. 资源释放 可以释放 必须释放
5. 段错误危害 危害比较小 可能导致系统崩溃
【3】模块三要素
模块许可证声明(必须)
大多数情况下,内核模块应遵循GPL兼容许可权。
Linux 2.6内核模块最常见的是以MODULE_LICENSE( "GPL" )
模块加载函数(必须) 插入模块的时候执行
1 --- 缺省的形式
int init_module(void)
{
//做初始化相关的动作
return 0;
}
2 -- 自定义的形式
int hello_init(void)
{
//做初始化相关的动作
return 0;
}
module_init(hello_init);
模块卸载函数(必须) 卸载模块的时候执行
1 --- 缺省的形式
void cleanup_module(void)
{
//做和init_module相反的动作
}
2 -- 自定义的形式
void hello_exit(void)
{
//做和init_module相反的动作
}
module_exit(hello_exit);
【3】模块相关的命令
插入模块:
sudo insmod hello.ko
查看模块
lsmod
定位查找
lsmod | grep hello
卸载模块
sudo rmmod hello
查看printk打印的信息
dmesg
清除
sudo dmesg -c
-C
查看模块信息
modinfo hello.ko
【4】模块参数
1. 在驱动里面定义一个变量并初始化
int myint = 0;
2. 声明变量用来接收参数
module_param(变量名,变量类型,参数读/写权限)
module_param(myint, int, 600);
3. 使用
sudo insmod hello.ko myint=100
传字符串参数
module_param(mystring, charp, 600)
sudo insmod hello.ko myint=100 mystring="hello"
传数组参数
module_param_array(myarr, int, &arr_num, S_IRUGO);
insmod hello.ko myint=100 mystring="hello" myarr=1,3,5,7