linux 内核模块
1.内核模块相关命令
- lsmod 列出当前模块信息和依赖,实际上是读取并分析
/proc/modules
文件 - insmod 加载内核模块,内核加载模块信息在
/sys/module
目录下 - modprobe 命令加载命令以
modprobe -r filename
会同时卸载依赖模块,模块依赖关系放在/lib/modules/<kernel-version>/modules.dep
文件,实际是编译内核是有depmod工具生成 - 使用modinfo命令可以获取模块的信息,包括模块的作者,说明和支持的参数;
- rmmod 命令用于删除模块
- depmod命令用于分析可载入模块的相依性
2.linux 段
linux 内核
可以使用request_module
函数加载内核模块;__init
初始化段__initdata
初始化阶段需要的数据,内核初始化完后可以释放掉__exit
模块卸载函数__exitdata
退出阶段采用的数据
3.linux 模块参数
module_param(name, type, perm);
- name:用作参数的变量的名称。
- type:参数的类型(bool、charp、byte、short、ushort、int、uint、long、ulong),其中charp代表字符指针。
- perm:代表
/sys/module/<module>/parameters/<param>
文件的权限,其中包括S_IWUSR
、S_IRUSR
、S_IXUSR
、S_IRGRP
、S_WGRP
和S_IRUGO
。
当使用模块参数时,应该用MODULE_PARM_DESC
描述每个参数,这些参数可以通过modinfo
查看。
static char *mystr = "hello";
static int myint = 1;
static int myarr[3] = {0, 1, 2};
module_param(myint, int, S_IRUGO);
module_param(mystr, charp, S_IRUGO);
module_param_array(myarr, int,NULL,S_IWUSR|S_IRUSR);
MODULE_PARM_DESC(myint,"this is my int variable");
MODULE_PARM_DESC(mystr,"this is my char pointer variable");
MODULE_PARM_DESC(myarr,"this is my array of int");
运行上述模块时,要在加载该模块时提供参数 insmod hellomodule-params.ko mystring="packtpub" myint=15 myArray=1,2,3
,否则为默认值。
4.导出符号
使用EXPORT_SYMBOL(符号名)
或者EXPORT_SYMBOL_GPL(符号名)
导出符号到内核符号表中,对应的内核符号表文件在/proc/kallsysms
,它记录了符号以及所在的内存地址。
5.模块声明与描述
MODULE_AUTHOR(author);//模块作者
MODULE_VERSION(version);//模块版本
MODULE_ALIAS(alternate_name);//模块别名
MODULE_DESCRIPTION(description);//模块描述
MODULE_LICENSE(license);//模块license
MODULE_DEVICE_TABLE(table_info);//模块设备列表
MODULE_INFO(tag,info)//用户添加tag=info信息
模块声明真正底层宏是MODULE_INFO
,其他的宏其本质也是调用这个红来给指定变量赋值,比如MODULE_AUTHOR(my)
本质是将MODULE_INFO(author,my)
。
6.参考资料
书籍《Linux设备驱动开发((法)约翰·马迪厄(John Madieu)》
书籍《Linux设备驱动开发详解:基于最新的Linux 4.0内核》
不足之处,敬请指出,谢谢^_^