Linux内核模块文件组成介绍

news2025/4/8 21:24:26

Linux驱动开发主要的工作就是编写模块,一个典型的Linux内核模块文件.ko 主要由以下几个部分组成。

模块加载函数(必须)

当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。

Linux内核模块加载函数一般用static 关键字声明为内部链接,并以__init 标识。之所以标识为__init ,用途是如果编译内核时模块是以静态方式包含在vmlinux中,则在链接的时候标识为__init 的函数会放在.init.text 这个区,同时还会在.initcall.init 区中保存一份函数指针,在内核初始化阶段会通过这些函数指针调用这些初始化函数,在初始化阶段完成后,这些init区段会被释放以节省内存。

模块加载函数必须以module_init(函数名) 的形式被指定。它返回整型值,若初始化成功,返回0。初始化失败时,应该返回错误编码。内核的错误码是一个负数,在中定义,形如ENODEV等。

示例代码如下:

1. static int __init foo_init(void)

2. {

3. //...

4. }

5. module_init(foo_init);

模块卸载函数(必须)

当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。

Linux内核模块卸载函数一般用static 关键字声明为内部链接,并以__exit 标识。和__init 一样, __exit 也可以使对应函数在运行完成后自动回收内存。具体可以查看内核代码中__init 和__exit 这两个宏的定义。

模块卸载函数必须以module_exit(函数名) 的形式指定,不返回任何值。

示例代码如下:

1. static void __exit foo_exit(void)

2. {

3. //...

4. }

5. module_exit(foo_exit);

模块许可证声明(必须)

模块许可证(LICENSE)声明描述内核模块的许可权限,如果不声明 LICENSE,模块被加载时,将收到内核被污染(kernel tainted)的警告。在Linux2.6内核中,可接受的 LICENSE包括“GPL”,“GPL v2”,“GPL and additonal rights”,“Dual BSD/GPL”,“Dual MPL/GPL”和“Proprietary”。

大多数情况下,内核模块应遵循GPL兼容许可权。Linux2.6内核模块常见的是声明模块采用BSD/GPL双LICENSE,如下:

1. MODULE_LICENSE("Dual BSD/GPL");

模块参数(可选)

模块参数是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量。

在装载内核模块时,用户可以向模块传递参数,形式为“insmode(或modprobe) 模块名 参数名=参数值”,如果不传递,参数将使用模块内定义的默认值。 模块内部可以用module_param(参数名,参数类型,参数读/写权限) 定义一个参数,例如:

1. static char *str = "hello,world";

2. static int num = 4000;

3. module_param(num, int, S_IRUGO);

4. module_param(str, charp, S_IRUGO);

模块导出符号(可选)

内核模块可以导出符号(symbol,对应于函数或变量),这样其它模块可以使用本模块中的变量或函数。

Linux2.6的/proc/kallsyms 文件对应着内核符号表,它记录了符号以及符号所在的内存地址。

模块可以使用如下宏导出符号到内核符号表:

1. EXPORT_SYMBOL(符号名);

2. EXPORT_SYMBOL_GPL(符号名);

导出的符号将可以被其他模块使用,使用前声明一下即可。EXPORT_SYMBOL_GPL() 适用于包含GPL许可证的模块。例如:

1. #include

2. #include

3. MODULE_LICENSE("Dual BSD/GPL");

4.

5. init add(int a,int b)

6. {

7. return a + b;

8. }

9. EXPORT_SYMBOL(add);

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

我们可以使用MODULE_AUTHOR , MODULE_DESCRIPTION , MODULE_VERSION , MODULE_DEVICE_TABLE , MODULE_ALLAS 分别声明模块的作者,描述,版本,设备表和别名。

其中注意MODULE_DEVICE_TABLE 常用于PCI或者USB驱动中表明该驱动模块所支持的设备。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,

差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。(点击找小助理领取)扫码进群领资料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1329810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js显示实时时间

文章目录 一、效果二、思路三、最后 一、效果 用JS实现XXXX年XX月XX日 星期X XX时XX分XX秒 效果 效果 &#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>time</title><script t…

【数据结构】队列的使用|模拟实现|循环队列|双端队列|面试题

一、 队列(Queue) 1.1 概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾&#xff08;Tail/Rear&#xff09; 出队列…

nodejs微信小程序+python+PHP兴趣趣班预约管理系统设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

webpack学习-7.创建库

webpack学习-7.创建库 1.暴露库1.1概念1.2验证1.2.1 不导出方法1.2.2 导出方法 2.外部化 lodash3.外部化的限制4.最终步骤5.使用自己的库5.1坑 6.总结 1.暴露库 这个模块学习有点坑。看名字就是把自己写的个包传到npm&#xff0c;而且还要在项目中使用到它&#xff0c;支持各种…

LLM之RAG实战(八)| 使用Neo4j和LlamaIndex实现多模态RAG

人工智能和大型语言模型领域正在迅速发展。一年前&#xff0c;没有人使用LLM来提高生产力。时至今日&#xff0c;很难想象我们大多数人或多或少都在使用LLM提供服务&#xff0c;从个人助手到文生图场景。由于大量的研究和兴趣&#xff0c;LLM每天都在变得越来越好、越来越聪明。…

ztree选中回显到ztree树上

点击修改&#xff0c;让数据显示到树形结构上边 $(".updateSupplyBtn").click(function (){var ztreeIds $("#sortId").val(); if(ztreeIds.trim()!""){ var ztree $.fn.zTree.getZTreeObj("menuTree"); var ztreeId ztreeIds.s…

构建数字化金融生态系统:云原生的创新方法

内容来自演讲&#xff1a;曾祥龙 | DaoCloud | 解决方案架构师 摘要 本文探讨了金融企业在实施云原生体系时面临的挑战&#xff0c;包括复杂性、安全、数据持久化、服务网格使用和高可用容灾架构等。针对网络管理复杂性&#xff0c;文章提出了Spiderpool开源项目&#xff0c;…

使用OpenCV DNN模块进行人脸检测

内容的一部分来源于贾志刚的《opencv4应用开发、入门、进阶与工程化实践》。这本书我大概看了一下&#xff0c;也就后面几章比较感兴趣&#xff0c;但是内容很少&#xff0c;并没有想像的那种充实。不过学习还是要学习的。 在实际工程项目中&#xff0c;并不是说我们将神经网络…

MATLAB Mobile - 使用预训练网络对手机拍摄的图像进行分类

系列文章目录 前言 此示例说明如何使用深度学习对移动设备摄像头采集的图像进行分类。 在您的移动设备上安装和设置 MATLAB Mobile™。然后&#xff0c;从 MATLAB Mobile 的“设置”登录 MathWorks Cloud。 在您的设备上启动 MATLAB Mobile。 一、在您的设备上安装 MATLAB M…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)

在这篇文章中虽然实现了能够和多客户端建立连接&#xff0c;并且同时和多个客户端进行通信。 基于多反应堆的高并发服务器【C/C/Reactor】&#xff08;上&#xff09;-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135141316?spm1001.2014.3001.5501但是有…

linux 查看glibc的版本、查看所安装的软件的依赖

GLIBC是一个C标准库&#xff0c;很多C/C程序都会依赖它&#xff0c;在linux系统上安装一些软件&#xff08;库&#xff09;时&#xff0c;linux系统需要满足该软件&#xff08;库&#xff09;的所有依赖才行&#xff0c;否则&#xff0c;就会出现无法安装或使用的问题&#xff…

可视化开发

可视化开发 数据可视化 交互式可视化 文章目录 可视化开发前言一、可视化开发二、Python数据可视化大屏GIS图像智能识别处理软件开发三、可视化开发必备总结前言 可视化开发可以帮助开发者通过图形化界面和拖放操作来创建、编辑和测试应用程序。使用这些工具,开发者可以提高开…

(JAVA)-线程中的通信(生产者消费者模型)

在Java线程通信中&#xff0c;等待通知机制是最传统的方式&#xff0c;就是在一个线程进行了规定操作后&#xff0c;该线程就进入等待状态&#xff08;wait&#xff09;&#xff0c; 等待其它线程执行完它们的指定代码过后&#xff0c;再将之前等待的线程唤醒&#xff08;notif…

mmyolo导出模型

报错&#xff1a;python mmyolo/projects/easydeploy/tools/export_onnx.py configs/yolov7/tfj_yolov7_tiny_syncbn_fast_8x16b-300e_coco.py work_dirs/tfj_yolov7_tiny_syncbn_fast_8x16b-300e_coco/best_coco_bbox_mAP_epoch_10.pth --model-only --simplify 运行报错 No m…

springboot学习笔记(五)

MybatisPlus进阶 1.MybatisPlus一对多查询 2.分页查询 1.MybatisPlus一对多查询 场景&#xff1a;我有一个表&#xff0c;里面填写的是用户的个人信息&#xff08;姓名&#xff0c;生日&#xff0c;密码&#xff0c;用户ID&#xff09;。我还有一个表填写的订单信息&#x…

读算法霸权笔记01_数学杀伤性武器

1. 数学应用助推数据经济&#xff0c;但这些应用的建立是基于不可靠的人类所做的选择 1.1. 房地产危机&#xff0c;大型金融机构倒闭&#xff0c;失业率上升&#xff0c;在幕后运用着神奇公式的数学家们成为这些灾难的帮凶 1.2. 数学逐渐不再关注全球金融市场动态&#xff0c…

Flutter 三: Dart

1 数据类型 数字(number) int double 字符串转换成 num int.parse(“1”) double.parse(“1”);double 四舍五入保留两位小数 toStringAsFixed(2) 返回值为stringdouble 直接舍弃小数点后几位的数据 可使用字符串截取的方式 字符串(string) 单引号 双引号 三引号三引号 可以输…

微信小程序promise封装

一. 在utils文件夹内创建一个request.js 写以下封装的 wx.request() 方法 const baseURL https:// 域名 ; //公用总路径地址 export const request (params) > { //暴露出去一个函数&#xff0c;并且接收一个外部传入的参数let dataObj params.data || {}; //…

MsSQL中的索引到底长啥样,查找过程怎么进行

参考文章一 参考文章二 建表 mysql> create table user(-> id int(10) auto_increment,-> name varchar(30),-> age tinyint(4),-> primary key (id),-> index idx_age (age)-> )engineinnodb charsetutf8mb4;insert into user(name,age) values(张三,…

使用Aspose.Slides 控件,在线将 ODP 转换为 PPT

OpenOffice 等开源生产力工具有其用途。但如果您希望在线将 ODP 转换为 PPT&#xff0c;您很可能已经确定 Microsoft PowerPoint 的专有 PPT 格式和平台比 OpenOffice ODP 更适合您的需求。 本文的第一部分重点介绍在线将 ODP 转换为 PPT 的快速方法。第二部分探讨涉及C#应用程…