Linux 内核的版本控制

Linux 内核的版本控制以及确保模块兼容性是开发和维护 Linux 系统时非常重要的一部分。
Linux 内核采用了语义版本控制(Semantic Versioning),通常由三个部分组成:
主版本号(major)、次版本号(minor)和补丁版本号(patch),形式为 X.Y.Z

1. 版本控制原则

  • 主版本号 (X): 当发生重大变化或不向后兼容的修改时,主版本号会增加。自 Linux 2.6 起,主版本号一直保持为 2,直到 3.0 才更新。现在最新的主版本号是 6。
  • 次版本号 (Y): 每次增加新功能但保持向后兼容时,次版本号增加。
  • 补丁版本号 (Z): 进行错误修复、性能优化等小型改动时,补丁版本号增加。

例如,Linux 5.10.12 表示:

  • 5:主版本号
  • 10:次版本号
  • 12:补丁版本号

2. 不同内核版本的变化

不同内核版本之间可能包括以下几类变化:

  • 新功能引入:添加新的内核功能或子系统,例如新的文件系统、网络协议支持、硬件支持等。
  • 性能优化:在不同版本中,内核可能会优化某些子系统的性能,例如调度器、内存管理、I/O 性能优化等。
  • API 和 ABI 改变:内核的应用程序编程接口 (API) 和应用程序二进制接口 (ABI) 可能在新版本中发生变化,特别是主版本号变更时。这会导致编写的模块可能在新版本上不兼容。

3. 确保内核模块的兼容性

确保模块在不同内核版本间的兼容性是开发内核模块时的核心工作,以下是一些常用的策略:

1. 使用内核版本号检查

内核头文件中提供了 LINUX_VERSION_CODEKERNEL_VERSION() 宏,这些宏可以帮助检查当前运行的内核版本号,从而在代码中做出针对不同版本的差异化处理:

#include <linux/version.h>#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,10,0)
// 针对 Linux 5.10 或以上版本的代码
#else
// 针对更低版本的代码
#endif
2. 尽量使用稳定的 API

尽量使用内核提供的公共 API 和函数,而不是直接访问内核内部数据结构。Linux 内核开发者会尽量保持这些公共 API 的稳定性,这样模块在不同内核版本之间的兼容性更好。

3. 使用模块兼容层

有时不同内核版本之间 API 的变化会影响模块的编写,可以使用一种“兼容层”(compatibility layer)方法,将不同版本的 API 调用封装起来,根据内核版本动态调用对应的接口。

4. 为多个内核版本进行编译测试

如果你需要支持多个内核版本,最好针对不同版本的内核进行编译测试。这样可以确保模块在不同内核版本上能够正确编译并运行。

5. 使用 DKMS

DKMS (Dynamic Kernel Module Support) 是一种机制,能够帮助动态地构建和安装内核模块。使用 DKMS 可以在内核升级后自动重建模块,确保模块始终与当前内核兼容。
DKMS (Dynamic Kernel Module Support) 是一套用于自动构建和管理 Linux 内核模块的系统。它允许在内核升级时动态重建模块,使其能够在新内核中继续正常工作。这在内核更新频繁的情况下尤为有用,尤其是对于那些依赖特定模块的系统来说,例如显卡驱动、虚拟化工具等。

1. DKMS 的作用
  • 自动重建内核模块:当系统升级内核时,内核模块通常需要重新编译以适配新内核。DKMS 会在内核升级时自动重建这些模块,省去了手动重编译的麻烦。
  • 版本控制:DKMS 支持多个内核版本,允许用户在系统上保留多个模块版本,适配不同的内核。
  • 动态加载/卸载模块:DKMS 支持在不同内核版本间动态加载或卸载模块,确保模块与内核的兼容性。
2. DKMS 的工作原理

DKMS 的工作过程一般如下:

  1. 当你安装一个支持 DKMS 的内核模块时,系统会将模块的源代码放置在 /usr/src 目录下,并生成一个 DKMS 配置文件。
  2. 内核升级或模块更新时,DKMS 会自动重新编译并安装模块,以确保新内核中能加载该模块。
  3. 使用 dkms install 可以手动安装模块,使用 dkms remove 可以卸载模块。
3. DKMS 配置文件

每个支持 DKMS 的模块会在其源码目录中包含一个配置文件,通常命名为 dkms.conf。该文件定义了模块的相关信息,如模块名、版本号、编译步骤等。

下面是一个示例 dkms.conf 文件的内容:

PACKAGE_NAME="my_module"
PACKAGE_VERSION="1.0"
CLEAN="make clean"
MAKE="make"
BUILT_MODULE_NAME[0]="my_module"
DEST_MODULE_LOCATION[0]="/extra/my_module"
AUTOINSTALL="yes"
  • PACKAGE_NAMEPACKAGE_VERSION 定义了模块的名称和版本。
  • MAKECLEAN 定义了编译和清理模块的命令。
  • BUILT_MODULE_NAME 是生成的模块文件名。
  • DEST_MODULE_LOCATION 指定模块安装的位置。
  • AUTOINSTALL 如果设置为 yes,则内核更新时会自动安装该模块。
4. DKMS 的常用命令

使用 DKMS 时,可以通过以下一些命令来管理模块:

  1. 安装模块

    sudo dkms install my_module/1.0
    

    这会安装 my_module 版本 1.0,并将其编译和安装到当前内核。

  2. 删除模块

    sudo dkms remove my_module/1.0 --all
    

    删除所有内核中与 my_module 相关的模块。

  3. 列出已安装的模块

    dkms status
    

    这会列出所有已安装的 DKMS 模块及其版本信息。

  4. 构建模块

    sudo dkms build my_module/1.0
    

    仅构建模块而不安装。

  5. 检查模块兼容性

    sudo dkms autoinstall
    

    这会在内核升级后自动检查并重新安装所有 DKMS 管理的模块。

5. DKMS 的优势
  • 内核更新后的自动处理:通过 DKMS,模块可以在内核更新后自动重建和安装,避免了用户手动编译的麻烦。
  • 模块的跨内核兼容性:DKMS 能够管理多个不同内核版本下的模块,允许用户在系统上同时运行多个内核版本。
  • 社区支持:许多第三方驱动程序(如 Nvidia、VirtualBox 等)都通过 DKMS 提供支持,用户可以更加方便地管理这些模块。
6. 实际使用中的注意事项
  • 源码依赖:DKMS 依赖模块的源代码,因此需要确保系统中安装了必要的构建工具和头文件(如 linux-headers)。
  • 编译失败处理:如果在编译过程中出现错误,可以使用 dkms build 来手动重建模块并排查问题。
  • 内核模块的合法性:确保你安装的模块是与当前内核版本兼容的,并且源码的授权和使用符合相关法律法规。
6. 内核 ABI 兼容性检查

为了保持用户空间程序与内核的兼容性,内核提供了用户空间可用的 ABI(应用程序二进制接口)。在主版本号和次版本号变更时,ABI 可能会发生改变,因此需要确保用户空间应用依赖的内核 ABI 是稳定的。

4. 实践中的挑战

在实际开发中,内核 API 的变化和不兼容可能会引入许多挑战,特别是对于长期支持 (LTS) 内核和新发布的内核版本。因此,模块开发者应尽量关注内核的变更日志和内核邮件列表,以了解即将到来的变更并为其模块做好准备。

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

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

相关文章

卸载完mathtype后,删除word加载项中的mathtype

请参考博客“卸载完mathtype后&#xff0c;word加载项中还是有mathtype的解决方法_怎么删除word加载项里的mathtype-CSDN博客”以及 “安装卸载MathType经验解决MathType DLL找不到的问题——超实用_mathtype dll cannot-CSDN博客” 如果在删除.dotm文件时&#xff0c;删不掉…

随着访问范围的扩大 OpenAI o1-mini 现已向免费用户开放

上周&#xff0c;OpenAI 展示了其最新的大型语言模型&#xff08;LLM&#xff09;–OpenAI o1及其小兄弟 OpenAI o1-mini。该公司在公告中称&#xff0c;Plus 和 Team 用户可在公告发布之日起访问该模型。企业和教育用户将在本周获得该模型&#xff0c;而免费用户最终将获得 o1…

Golang | Leetcode Golang题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; func isLeafNode(node *TreeNode) bool {return node.Left nil && node.Right nil }func sumOfLeftLeaves(root *TreeNode) (ans int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {node : q[0]q q[1:]if no…

Mac 上,终端如何开启 proxy

前提 确保你的浏览器可以访问 google&#xff0c;就是得先有这个能力 步骤 查看网络的 http/https 还有 socks5 的 port配置 .zshrc 查看 port 点击 wifi 设置 以我的为例&#xff0c;我的 http/https 都是 7890&#xff0c; socks5 是 7891 查看代理的port 以我的软件…

清华团队发布鼻咽癌诊断模型,自动从HE染色图像生成EBER染色图像|文献精析·24-09-18

小罗碎碎念 今天精读的这篇文章于2024年7月22日发表&#xff0c;作者来自清华大学和广西大学。 角色姓名单位名称&#xff08;中文&#xff09;第一作者曾清华大学珠三角研究院医学光学技术研发中心&#xff0c;广州通讯作者何清华大学深圳国际研究生院生物制药与健康工程研究所…

【Django5】django的helloworld

安装django pip install djangoDjango官方中文文档 https://docs.djangoproject.com/zh-hans/5.1/Github链接 https://github.com/django/django创建Django项目 cd到想要创建项目的文件夹下&#xff0c;输入以下命令创建项目 这行代码将会在当前目录下创建一个 mysite 目录 …

算法.图论-并查集上

文章目录 1. 并查集介绍2. 并查集的实现2.1 实现逻辑2.2 isSameSet方法2.3 union方法(小挂大优化)2.4 find方法(路径压缩优化) 3. 并查集模板 1. 并查集介绍 定义&#xff1a; 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题&#xff08;即所…

JavaDS —— 图

图的概念 图是由顶点集合以及顶点之间的关系组成的一种数据结构&#xff1a;G &#xff08;V&#xff0c;E&#xff09; 其中 V 表示的是顶点集合 &#xff1a; V { x | x 属于某个数据对象集} 是有穷非空集合 E 叫做边的集合 &#xff1a; E {(x, y) | x, y 属于 V} 或者 …

Qt 模型视图(二):模型类QAbstractItemModel

文章目录 Qt 模型视图(二)&#xff1a;模型类QAbstractItemModel1.基本概念1.1.模型的基本结构1.2.模型索引1.3.行号和列号1.4.父项1.5.项的角色1.6.总结 Qt 模型视图(二)&#xff1a;模型类QAbstractItemModel ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模…

Kotlin cancel CoroutineScope.launch的任务后仍运行

Kotlin cancel CoroutineScope.launch的任务后仍运行 import kotlinx.coroutines.*fun main() {runBlocking {val coroutineScope CoroutineScope(Dispatchers.IO)val job coroutineScope.launch {var i 0while (i < Int.MAX_VALUE) {iprintln(i)}}// 2ms 取消协程delay(…

搜索小车运动最短路径python代码实现

一、实验任务 场地中正方格代表障碍物&#xff0c;选取小车运动起点和终点。编程探究小车从起点运动到终点&#xff0c;总共有几种可行的路径&#xff08;路径不含重叠部分&#xff09;&#xff0c;同时找出最短路径并可视化。 二、实验思路 把场地抽象化为69的平面矩阵&…

Deep Learning-Based Object Pose Estimation:A Comprehensive Survey

论文&#xff1a;https://arxiv.org/pdf/2405.07801v3 项目&#xff1a;https://github.com/CNJianLiu/Awesome-Object-Pose-Estimation 年份&#xff1a;2024 方向&#xff1a;姿态估计 1. 目标姿态估计定义 估计图像中目标相对于相机的姿态&#xff0c; 目标姿态估计是增…

YoloV8 trick讲解

1.将 YOLOv5 的 C3结构换成了梯度流更丰富的 C2f结构: C3 C3 模块的设计灵感来自 CSPNet&#xff0c;其核心思想是将特征图的部分通道进行分割和并行处理&#xff0c;目的是减少冗余梯度信息&#xff0c;同时保持较高的网络表达能力。C3 结构与传统的残差结构类似&#xff0c;但…

yolov5/8/9/10模型在VOC数据集上的应用【代码+数据集+python环境+GUI系统】

yolov5/8/9/10模型在VOC数据集上的应用【代码数据集python环境GUI系统】 1.背景意义 VOC数据集被广泛应用于计算机视觉领域的研究和实验中&#xff0c;特别是目标检测和图像识别任务。许多知名的目标检测算法都使用VOC数据集进行训练和测试。VOC挑战赛&#xff08;VOC Challeng…

neo4j安装启动教程+对应的jdk配置

参考这位博主的视频教程&#xff1a;neo4j社区windows版下载 一、官网下载neo4j的安装包 &#xff08;1&#xff09;官网下载页面 &#xff08;2&#xff09;上一步 【download】之后&#xff0c;会自动下载&#xff0c;如果没有&#xff0c;点击【here】 这里可以看到一行字…

深度学习——基础知识

深度学习的重点在于优化&#xff0c;其中很重要的步骤在于如何调参&#xff0c;会涉及到一些微积分等数学知识。不同于以往接触到的数值运算&#xff0c;深度&#xff08;机器&#xff09;学习都是关于张量Tensor&#xff08;向量&#xff09;的计算&#xff0c;Python中最常用…

【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)

目录 一、插入排序 算法思想 二、插入排序 算法步骤 四、复杂度分析 时间复杂度&#xff1a;O(n^2) 空间复杂度&#xff1a;O(1) 稳定性&#xff1a;稳定算法 五、应用场景 &#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;探索数据结构…

【JAVA开源】基于Vue和SpringBoot的购物商城网站

本文项目编号 T 032 &#xff0c;文末自助获取源码 \color{red}{T032&#xff0c;文末自助获取源码} T032&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【Java面试】第九天

&#x1f31f;个人主页&#xff1a;时间会证明一切. 目录 Spring中如何开启事务&#xff1f;编程式事务声明式事务声明式事务的优点声明式事务的粒度问题声明式事务用不对容易失效 Spring的事务传播机制有哪些&#xff1f;Spring事务失效可能是哪些原因&#xff1f;代理失效的情…

红黑树的插入(NGINX源码)

下载并查看NGINX源码 访问NGINX下载页面&#xff0c;找到所需版本 https://nginx.org/en/download.html 使用wget下载源码包&#xff0c;替换版本号为所需版本 wget http://nginx.org/download/nginx-1.24.0.tar.gz解压源码包 tar -xzvf nginx-1.24.0.tar.gz进入解压后的目…