内核模块机制
编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态的加载到内核中。
模块的特点
l
l
Linux内核模块的组成部分
1、
Static int __int initialization_function(void)
{
*****
}
Module_init(initialization);
2、
若模块加载函数注册了×××,则模块卸载函数应该注销××
加载函数动态申请了内存,卸载函数要注销该内存
加载函数申请了硬件资源(中断、DMA通道、IO端口、IO内存)的占用,则卸载函数要释放这些硬件资源
加载函数开启了硬件,卸载函数要关闭它们。
Static void __exit cleanup_function(void)
{
}
Module_exit(cleanup_function);
__init和__exit一样可以使对应函数在运行完成后自动回收内存。
3、
4、
Module_param(参数名,参数类型,参数读写权限);
5、
EXPORT_SYMBOL(符号名/函数名);
6、
MODULE_AUTHOR(author);
MODULE_DESCRIPTION(描述);
MODULE_VERSION(版本);
MODULE_DEVICE_TABLE();
MODULE_ALIAS(别名);
为什么内核中的变量和和函数声明为静态类型:
在函数体内声明的静态变量在这个函数被调用的过程中维持其值不变;
在模块内(在函数体外),一个被声明为静态的变量可以被模块内所用的函数访问,但不能被模块外的其他函数访问,他是一个本地全局变量;
在模块内,一个被声明为静态的函数只能被模块内的其他函数调用。
Linux内核都是按照最为规范的软件编程规范写的,如果函数不用static修饰,那么很可能被别的软件人员在不经意之间调用,从而产生难以寻找的错误。Linux内核是按照模块来加载功能块的,每个模块内的函数需要限值在本模块中运行。