Linux内核模块

Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用需要的组件呢:
方法一:把所有的组件都编译进内核文件,即:zImage或bzImage,但这样会导致两个问题:一是生成的内核文件过大;二:是如果要添加或删除某个组件,需要重新编译整个内核。
方法二:Linux提供了一种叫做“内核模块”的机制,能让内核文件(zImage或bzImage)本身并不包含某组件,而是在该组件需要被使用的时候,动态地添加到正在运行的内核中。

内核模块具有如下特点:
• 模块本身并不被编译进内核文件(zImage或者bzImage)。
• 可以根据需求,在内核运行期间动态的安装或卸载。

程序结构

1、模块加载函数(必需)

安装模块时被系统自动调用的函数,通过module_init宏来指定。

2、模块卸载函数(必需)

卸载模块时被系统自动调用的函数,通过module_exit宏来指定。

模块的编译

使用Makefile

安装与卸载

加载insmod (insmod xx.ko)
卸载rmmod (rmmod xx)
查看lsmod
加载modprobe (modprobe xx)
modprobe 如同insmod, 也是加载一个模块到内核。它的不同之处在于它会根据文件来查看要加载的模块, 看它是否还依赖于其他模块,如果是,modprobe 会首先找到这些模块, 把它们先加载到内核。

内核模块和应用程序的区别

对比应用程序,内核模块具有以下不同:应用程序是从头(main)到尾执行任务,执行结束后从内存中消失。内核模块则是先在内核中注册自己以便服务于将来的某个请求,然后它的初始化函数结束,此时模块仍然存在于内核中,直到卸载函数被调用,模块才从内核中消失。

模块可选信息

1、许可证申明
宏MODULE_LICENSE用来告知内核, 该模块带有一个许可证,没有这样的说明,加载模块时内核会抱怨。有效的许可证有”GPL“、”GPLv2”、”GPL and additional rights”、”Dual
BSD/GPL”、”Dual MPL/GPL”和”Proprietary”。
2、作者申明(可选)
MODULE_AUTHOR(“Simon Li”);
3、模块描述(可选)
MODULE_DESCRIPTION(“Hello World Module”);
4、模块版本(可选)
MODULE_VERSION(“V1.0”);
5、模块别名(可选)
MODULE_ALIAS(“a simple module”);
6、模块参数
通过宏module_param指定模块参数,模块参数用于在加载模块时传递参数给模块。
module_param(name,type,perm)
name是模块参数的名称,type是这个参数的类型, perm是模块参数的访问权限。
type常见值:
bool:布尔型 int:整型 charp:字符串型
perm 常见值:
S_IRUGO:任何用户都对/sys/module中出现的该参数具有读权限
S_IWUSR:允许root用户修改/sys/module中出现的该参数
例如:
int a = 3;
char *st;
module_param(a,int, S_IRUGO);
module_param(st,charp, S_IRUGO);

内核符号导出

内核符号的导出使用:
EXPORT_SYMBOL(符号名)
EXPORT_SYMBOL_GPL(符号名)
其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块。

内核打印:Printk

Printk与Printf对比
相同点:
• 打印信息
不同点:
• Printk在内核中使用,Printf在应用程序中使用
• Printk允许根据严重程度,通过附加不同的“优先级”来对消息分类。
在 linux/kernel.h>中定义了8种记录级别。按照
优先级递减的顺序分别是:
KERN_EMERG “<0>”
用于紧急消息,常常是那些崩溃前的消息。
KERN_ALERT “<1>”
需要立刻行动的消息。
KERN_CRIT “<2>”
严重情况。
KERN_ERR “<3>”
错误情况。
KERN_WARNING “<4>”
有问题的警告
KERN_NOTICE “<5>”
正常情况,但是仍然值得注意
KERN_INFO “<6>”
信息型消息
KERN_DEBUG “<7>”
用作调试消息
没有指定优先级的printk默认使用DEFAULT_MESSAGE_LOGLEVEL优先级
控制台优先级配置:
控制台优先配置
对应的依次是:
Console_loglevel
Default_message_loglevel
Minimum_console_level
Default_console_loglevel

你可能感兴趣的:(linux,linux,kernel)