linux内核模块

lsmod实际上读取并分析/proc/modules文件

cat /proc/modules 

内核中已加载的模块的信息存在于/sys/modules. /sys/module 是一个 sysfs 目录层次, 包含当前加载模块的信息. /proc/moudles 是旧式的, 那种信息的单个文件版本. 其中的条目包含了模块名, 每个模块占用的内存数量, 以及使用计数. 另外的字串追加到每行的末尾来指定标志, 对这个模块当前是活动的.

linux内核模块程序结构
1) 加载函数(一般需要)
当通过insmod或modprobe加载内核模块时, 模块的加载函数会自动被内核执行.

static int __init initialization_function(void)
{
/*初始化代码*/
}
module_init(initialization_function); 

2) 卸载函数(一般需要)
当通过rmmod或者modprobe -r卸载模块时.

static int __init cleanup_function(void)
{
/*释放代码*/
}
module_exit(cleanup_function); 

3) 模块许可声明(必须)
如果不声明LICENSE, 模块被加载时, 会收到内核被污染(kernel tained)警告.

MODULE_LICENSE("GPL"); 

可选的LICENSE有: “GPL”, “GPL v2″, “GPL and additional rights”, “Dual BSD/GPL”,
“Dual MPL/GPL”, “Proprietary”.

4) 模块参数(可选)

module_param(parm, parm_type, module_flags); 

如果权限允许, 可以在/sys/modules/module_name/parameters/下面看到模块的参数.

5) 模块导出符号(可选)

EXPORT_SYMBOL(符号名);
EXPORT_SYMBOL_GPL(符号名); 

6) 模块作者等信息(可选)

MODULE_AUTHOR(author);
MODULE_DESCRIPTION(description);
MODULE_VERSION(version_string);
MODULE_DEVICE_TABLE(table_info);
MODULE_ALIAS(alternate_name);
原文地址:https://www.cnblogs.com/codestub/p/2144965.html