linux内核模块简介

内核模块机制

编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态的加载到内核中。

 

 

模块的特点

l  模块本身不被编译入内核镜像,从而控制了内核的大小。

l  模块一旦被加载,他就和内核中能够的其他部分完全一样。

 

Linux内核模块的组成部分

1、         模块加载函数:用insmodmodprobe加载内核模块时,模块的加载函数(module_init())会自动被内核执行,完成模块的相关初始化。

Static int __int initialization_function(void)

{

*****

}

Module_init(initialization);

2、         模块卸载函数:用rmmod时被调用module_exit()

若模块加载函数注册了×××,则模块卸载函数应该注销××

加载函数动态申请了内存,卸载函数要注销该内存

加载函数申请了硬件资源(中断、DMA通道、IO端口、IO内存)的占用,则卸载函数要释放这些硬件资源

加载函数开启了硬件,卸载函数要关闭它们。

Static void __exit cleanup_function(void)

{

}

Module_exit(cleanup_function);

__init__exit一样可以使对应函数在运行完成后自动回收内存。

3、         模块许可证声明:如果不声明LICENSE,模块被加载时,将收到内核被污染的通知警告。

4、         模块参数(可选):模块被加载时,可以被传递给他的值,本身对应模块内部的全局变量。

Module_param(参数名,参数类型,参数读写权限);

5、         模块导出符号:内核模块导出符号,这样其他模块可以使用本模块中的变量或者函数。

EXPORT_SYMBOL(符号名/函数名)

6、         模块作者等信息声明(可选)。

MODULE_AUTHOR(author);

MODULE_DESCRIPTION(描述);

MODULE_VERSION(版本);

MODULE_DEVICE_TABLE();

MODULE_ALIAS(别名);

 

 

为什么内核中的变量和和函数声明为静态类型:

在函数体内声明的静态变量在这个函数被调用的过程中维持其值不变;

在模块内(在函数体外),一个被声明为静态的变量可以被模块内所用的函数访问,但不能被模块外的其他函数访问,他是一个本地全局变量;

在模块内,一个被声明为静态的函数只能被模块内的其他函数调用。

Linux内核都是按照最为规范的软件编程规范写的,如果函数不用static修饰,那么很可能被别的软件人员在不经意之间调用,从而产生难以寻找的错误。Linux内核是按照模块来加载功能块的,每个模块内的函数需要限值在本模块中运行。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值