综述:如今linux内核整体框架十分庞大,我们如果直接把所有所需的功能编译进内核,会导致内核十分庞大,且在现有内核中我们无法对其增减。所以linux提供一种机制--模块。我们可以根据需要,对模块进行删减。
一)一个linux内核模块主要由如下几个部分组成
1 模块加载函数 当通过insmod或者modprobe命令加载内核模块时,
xxx_init会被执行。
static int _init xxx_init(void)
{
/*****函数体******/
}
注意还要通过如下代码,告知内核,此为模块加载函数
module_init(
xxx_init);
2 模块卸载函数 当通过执行rmmod命令时,
xxx_exit该函数会被执行。
static int _exit xxx_exit(void)
{
/*****函数体******/
}
注意还要通过如下代码,告知内核,此为模块卸载函数
modul_exit(
xxx_exit);
3 模块许可证声明
许可证声明描述内核的许可权限,如果不声明许可证,将收到内核被污染的警告。
相关代码为:MODULE_LICENSE("GPL");
4 模块参数 (可选)
模块参数是模块被加载时可以传递给它的值。
相关操作如下:
static int mod_num=0;
module_param(mod_num,int,S_IRUGO); //函数参数依次为 变量名,类型,读/写权限
insmod xxx.ko mod_num=100 //在用户运行时输入该命令,则mod_num将被赋值为100
我们可以在/sys/module/xxx/parameters 目录下使用 cat mod_num 命令查看mod_num的值
5 导出符号
若导出,其他模块则可以使用本模块的变量或函数。
相关代码如下
void xxx_fun()
{
.....
}
EXPORT_SYMBOL_GPL(xxx_fun);
6 模块声明与描述
我们可以用
MODULE_AUTHOR(author);
MODULE_VERSION(version_string);
并且我们可以使用如下命令。查看模块的信息
modinfo <模块名>