致谢:
微信公众号:嵌入式企鹅圈 每天都新增爱好者关注,感谢大家的支持和大牛们的建议。本人将竭力出品更多优质的原创文章回馈大家的厚爱!
引子:模块化机制优点
模块化机制(module)是Linux系统的一大创新,是Linux驱动开发和运行的基础(当然,module并不仅仅是支撑驱动)。其优点在于:
1.在系统运行动态加载模块,扩充内核的功能。不需要时可以卸载。
2. 修改内核功能,不必重新全部编译整改内核,只需要编译相应模块即可。
3.模块目标代码一旦被加载重定位到内核,其作用域和静态链接的代码完全等价。
本文重点阐述Linux module加载的来龙去脉,其中的奥秘就在于对宏module_init的解读。
一、模块例子
hello_module.c代码如下:
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_ALERT */
#include <linux/init.h> /*Needed for __init */
static int __init test_init(void){
printk(KERN_ALERT"Hello world!\n");
return 0;
}
static void __exit test_exit(void){
printk(KERN_ALERT"Goodbye world!\n");
}
module_init(test_init);
module_exit(test_exit);
二、模块编程要点
1.头文件 linux/module.h、linux/kernel.h、linux/init.h
2. 定义模块的初始化函数test_init(名字任意)和卸载函数test_exit(名字任意)。
3. 用宏module_init声明初始化函数,用宏module_exit声明卸载函数。
三、模块运行
模块代码有两种运行的方式:
1. 编译成可动态加载的module,并通过insmod来动态加载,接着进行初始化。
2. 静态编译链接进内核,在系统启动过程中进行初始化。
有些模块是必须要编译到内核,和内核一起运行的,从不卸载,如vfs、platform_bus等等。