1、什么是内核模块?
答:内核模块式一种机制:能让内核文件(zImage 或 bzImage)本身不包含某个组件,而是在该组件需要被使用时候,动态添加到正在运行的内核中。
2、内核模块特点
模块本身并不被编译进内核文件(zImage或者bzImage)。
可以根据需要,在内核运行期间动态的安装或卸载。
3、程序结构
1、模块加载函数(必需)
安装模块时被系统调用的函数,通过module_init宏来指定。
2、模块卸载函数(必需)
卸载时被系统自动调用的函数,通过module_exit宏来指定。
4、模块的编译
5、安装与卸载
加载 insmod 卸载 rmmod 查看 lsmod
加载modprobe 区别insmod 在于它会根据文件 /lib/module/< $version >/modules.dep 来查看要加载的模块,看是否还要依赖其他的模块,如果是,modprobe会首先找到这些依赖模块,把她们首先加载到内核。
6、模块可选信息
1、许可证 MODULE_LICENSE("xxx")
2、模块申明 MODULE_AUTHOR("XXX")
3、模块描述 MODULE_DESCRIPTION("XXX")
4、模块版本 MODULE_VERSION("XXX")
5、模块别名 MODULE_ALIAS("XXX")
7、模块参数
通过module_param指定模块参数,模块参数用于加载模块时传递参数给模块module_param(name,type,perm)
name是模块参数的名称,type是这个参数的类型;
perm是模块参数的访问权限;
type常见值:
bool;int;charp;
perm常见值:
S_IRUGO
S_IWUSR
内核符号导出/pro/kallsyms 记录了内核中所导出符号的名字和地址 EXPORT_SYMBOL().
8、常见问题:版本不匹配
解决方法
1、使用modprobe --force -modversion强行插入
2、确保百年一遇内核模块时,所以赖的内核代码版本等同于当前正在运行的内核,通过uname -r 查看当前正运行的内核模块。
9、内核打印优先级
KERN_EMERG "<0>" 用于紧急消息,常常是那些奔溃前的消息
KERN_ALERT "<1>"需要立刻行动的i消息
KERN_CRIT "<2>"严重情况
KERN_ERR "<3>"错误情况
KERN_WARNING "<4>"有问题的警告
KERN_NOTICE "<5>"正常情况,但是仍然值得注意
KERN_INFO "<6>"信息型消息
KERN_DEBUG "<7>"用作调试信息
控制台优先级配置
/proc/sys/kernel/printk
6 4 1 7
Console_loglevel
Sdfault_message_loglevel
Minimum_console_level
Default_console_loglevel
阅读(2028) | 评论(0) | 转发(0) |