Linux模块化机制和module_init

本文详细介绍了Linux模块化机制中的module_init,解释了如何动态加载和静态编译链接模块。通过示例代码展示了如何定义初始化和卸载函数,并通过module_init宏将它们与内核交互。在动态加载时,insmod命令调用sys_init_module系统调用来执行模块的初始化函数。
摘要由CSDN通过智能技术生成

        致谢:

微信公众号:嵌入式企鹅圈 每天都新增爱好者关注,感谢大家的支持和大牛们的建议。本人将竭力出品更多优质的原创文章回馈大家的厚爱!


引子:模块化机制优点


模块化机制(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等等。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值