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);