linux内核模块编程

主题: linux内核模块的程序结构--模块加载函数(必须),模块卸载函数(必须),模块许可证声明(必须),模块参数(可选),模块导出符号(可选),模块作者的等信息声明(可选)

一个linux内核模块主要由以下几个部分组成。
1、模块加载函数"用module_init()来指定"(必须)
当通过insmod和modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。
linux模块加载函数一般以 __init表示声明。典型声明如下::
static int __init initialization_function(void)
{
/*初始化代码*/
}
module_init(initialization_function);
模块加载函数必须使用module_init(函数名)的形式被指定。它返回整型值,若初始化成功,应返回0,而初始化失败时,应返回错误编码。在linux内核中,错误编码是一个负值,在<linux/errno.h>中定义,包括-ENODEV、-ENOMEM之类的符号值。返回相应的错误编码是种非常好的习惯,只有这样,应用程序才能利用perror等方法把他们转换成有意义的错误信息字符串。
在2.6内核中,可以使用“request_module(const char *fmt,...)函数”加载内核模块(注意:前面加载模块都是通过insmod和modprobe来实现的),驱动开发人员可以通过调用::
request_module(module_name);

request_module("char-major-%d-%d",MAJOR(dev),MINOR(dev));
来加载其他内核模块。
在linux内核中,所有表示为__init的函数在连接的时候放在.init.text这个区段内,此外,所有的__init函数在段.initcall.init中还保存了一份函数指针,在初始化时,内核会通过这些指针调用这些__init函数,并在初始化完成后释放init区段(.init.text,.initcall.init等)。

2、模块卸载函数"用module_exit()来指定"(必须)
当通过rmmod和modprobe -r命令卸载内核模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。
linux内核模块于在函数一般以__exit表示说明,典型的模块卸载函数的形式如下::
static void __exit cleanup_function(void)
{
/*释放代码*/
}
modu

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值