LInux设备驱动程序——module_init()和module_exit()

本文介绍了Linux设备驱动程序中的模块加载函数module_init()和模块卸载函数module_exit()的使用,包括它们的功能、作用以及内核加载初始化函数的机制。文章还探讨了为何使用这两个宏,以及如何通过它们管理驱动的初始化和清理过程。
摘要由CSDN通过智能技术生成

从五月份开始正式接触Linux设备驱动程序,到现在有2个多月了,其实真正算下来花费在这上面的时间有40天就不错吧,5月7日从家回来是真正的开始,回来之后花了大概有两周开始学习一些最基本的东西,这段时间也到了期末的时间,同时还要开各种会,很少能够真正的静下心来真正做些事情。到6月份开始准备图论和学位英语的考试,用了半个多月的时间,直到6月20号图论考试完才真正把全部精力投入到这上面。有时候真心感觉自己太急躁了,这个是从小养成的性格,慢慢要改变,这个应该算是一个目前来说最大的毛病了吧。不积跬步,无以至千里。不积小流,无以成江海。静下新慢慢来,加油。


     言归正传,下面是对前一段时间的学习的总结:

     模块加载函数

   我们知道几乎每个linux驱动都有个模块加载函数和模块卸载函数,这两部分是基本上对称的两部分,首先我们来说一下模块的加载函数部分,这部分的主要代码如下:

static  int _ _init initialization_function(void)

{

/*初始化部分*/

}

module_init(initialization_function);

       这一部分module_init()是一个宏定义,它的参数是一个函数名称(函数名称也就是函数的入口地址),至于为什么要使用这个宏定义,我们在下面会解释,现在需要知道的是:它是用来初始化的一个宏,当初始化成功的时候就会返回0,当初始化失败的时候机会返回错误编码,在Linux内核中错误编码是一系列的负值,在<linux/error.h>中有定义。在linux2.6内核中还可以是用request_module(module_name);或者request_module("char-major-%d-%d",MAJOR(dev),MINOR(dev));来加载其他的模块。

    在这里需要注意的是:所有标记为_ _init的函数在连接的时候都会放到。init.text这个段内。所有的_ _init在initcall.init中还保存一份函数指针,在初始化的时候内核会通过指针来调用这些函数,在初始化完成之后释放这些init区段。

    模块卸载函数 

   和加载模块类似,先写卸载模块的代码:

static  int _ _exit cleanup_function(void)

{

/*释放部分*/

}

module_exit(cleanup_function);

和加载模块类似,后面的是一个宏。这完成与加载模块相反的过程,主要有一下几方面的功能:

1、如果在加载模块中加载了某个模块,那么在卸载模块中就应该注销摸个模块

2、如果在加载模块中申请了内存,那么在这个模块中应该释放内存。

3、如果在加载模块中申请了硬件资源(中断、DMA、I/O端口和内存),那么在这个模块中应该释放相应的硬件资源。

4、如果在加载模块中打开了硬件,那么在这个模块中应该关闭硬件。


关于为什么要使用两个宏来实现两个模块,下面的内容主要来源于网上(http://blog.csdn.net/zhandoushi1982/article/details/4927579

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>

其中,init.h 定义了驱动的初始化和退出相关的函数。

kernel.h 定义了经常用到的函数原型及宏定义。

module.h 定义了内核模块相关的函数、变量及宏。

几乎每个linux驱动都有个module_init(与module_exit的定义在Init.h (\include\linux) 中)。驱动的加载就靠它。为什么需要这样一个宏?原因是按照一般的编程想法,各部分的初始化函数会在一个固定的函数里调用比如:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值