网站建设与维护实训心得,网站建设的大公司排名,wordpress背景偏暗,设计公司网站套餐内核模块开始学习前#xff0c;一定是最先接触到内核模块三要素(面试)#xff0c;驱动入口、驱动出口和协议的遵循。
1.内核模块三要素(面试)//修饰模块化驱动的入口函数module_init(demo_init);//修饰模块化驱动的出口函数module_eixt(demo_exit);//遵循GPL开源协议MODULE_… 内核模块开始学习前一定是最先接触到内核模块三要素(面试)驱动入口、驱动出口和协议的遵循。
1.内核模块三要素(面试)//修饰模块化驱动的入口函数module_init(demo_init);//修饰模块化驱动的出口函数module_eixt(demo_exit);//遵循GPL开源协议MODULE_LICENSE(GPL);记住就像没有那么多为什么 这个三要素没有那么多为什么记住就可以了每一个驱动模块都要遵循。 这里会涉及到三个宏module_init、module_exit、MODULE_LICENSE。我们到内核里面去找一下他们的原型 module_init 是 linux kernel 绝大多数模块的起始点我们所熟悉的应用程序都是从一个 main() 函数开始运行的但内核模块都是从module_init开始的向系统申请资源。 有开始就有结束与 module_init 对应的就是 module_exit 。module_exit 负责进行一些和init反向的活动例如
init 是注册驱动exit 就是注销驱动init 是申请资源exit 就是释放资源init 是创建节点exit 就是销毁节点
注意exit中活动的顺序应该对应 init 中活动的逆序
MODULE_LICENSE是固定的意思是要遵循什么开源协议使用是GPL
下面的是小例子
//头文件#include linux/init.h#include linux/module.h1.1.1入口函数函数向系统申请资源static int __init demo_init(void){//__init 用于修饰dome_init函数,作用是把这个函数放到init代码中//__init被定义在init.h中 #define __ init __sertion(.init.text)printk(exit demo_init)}1.1.2出口函数释放向内核申请的资源static void __exit demo_exit(void){printk(exit demo_exit)}1.1.3许可证遵循GPL开源协议//修饰模块化驱动的入口函数module_init(demo_init);//修饰模块化驱动的出口函数module_eixt(demo_exit);//遵循GPL开源协议MODULE_LICENSE(GPL);记住就像没有那么多为什么
上图以demo函数做一个例子其中的 static 和 __init 不是必须的
static 是为了函数不被模块外部错误引用注意不可使用内联定义__init 是告诉系统这个是用来初始化的函数运行后不必再保留在内存中入口格式int (*) (void)出口格式void (* ) (void)