内核模块的开发效率更高,而且可以在内核运行时动态加载。由于Linux内核模块是动态加载,所以它也叫可加载内核模块,洋文LKM(Loadable Kernel Module)。Linux内核镜像位于/boot目录下,启动时最先加载,LKM总是在内核启动之后加载。
LKM主要用于:设备驱动、文件系统驱动和系统调用。
下面我来编写一个简单的内核模块,了解一下基本开发流程。
要想编译LKM,我们需要C编译器和Linux内核头文件:
|
|
Hello World内核模块代码(hello.c)
|
|
- module_init定义了模块的入口函数,在模块加载insmoded时执行
- module_exit定义了模块的退出函数,在模块卸载rmmoded时执行
创建用于编译内核模块的Makefile:
|
|
输入make编译hello.c
查看模块信息
|
|
加载模块
|
|
查看模块
|
|
卸载模块
|
|
查看运行结果
|
|
备注
- 我们还需要进一步了解一下modprobe工具。和insmod一样,它也是用来将模块加载到内核中。它和insmod的区别在于,它会考虑要加载的模块是否引用了一些当前内核不存在的符号,如果存在,modprobe会在当前模块中搜索路径中查找定义了这些符号的其他模块,如果找到,它会同时将这些模块装载到内核中。这种情况下使用insmod则会失败,并在日志文件中记录”unresolved symbols”的消息。
- 如果初始化过程失败,唯一有效的方法是重新引导系统,并注销已经初始化的变量。
- 错误恢复过程中使用goto语句会比较有效
本文总阅读量 次
本文由 Yu Zhang 发表于 Yu Zhang's Blog ,采用署名-非商业性使用-禁止演绎 3.0进行许可。
非商业转载请注明作者及出处。商业转载请联系作者本人。