linux内核模块的版本检查机制

简介:
linux内核对插入的内核模块进行严格的版本检查,即使一个小版本号不一致也会导致加载的不成功,这完全是为了内核本身运行安全。由于linux内核的发布是基于版本号的,而所有的内核模块的开发必须依赖内核头文件--其使用的内核导出符号均在头文件中,该头文件肯定属于一个特定版本的源码树,因此模块也就间接依赖了该版本的源码树。那么到底为何内核对模块的版本检查如此严格呢?因为每当一个新的版本发布,可能导致接口的改变,如果不严格检查版本则可能导致内核crash,然而如果旧版本的模块难道没有任何办法载入到新版本的内核中吗?不是的!只要它使用的接口在两个版本间没有改变即可,这是通过一个非常有意思的机制实现的,这就是单独接口符号的crc校验机制。其实windows的ddk编译的驱动要想载入内核而不发生意外,接口的一致性也是必要的,只是ddk的编译环境为开发者屏蔽了很多版本方面的信息,第一,ddk自带了头文件并且windows的内核无法单独进行下载,它是和操作系统一起被发行的;第二,操作系统的内核,库,ddk是由微软统一管理的。因此,我们会觉得ddk编译出的驱动对系统版本没有要求,其实这是不对的,在ddk的Build Environments中,不是也有版本之分别吗?只是它的版本没有linux那么多罢了!
     首先要知道,内核中只要是EXPORT的符号,都会有一个crc校验码,这些校验码保存在内核映像中,这些校验码用于和载入内核的模块中包含的crc校验码作比较。模块编译的过程中,genksyms这个程序起了很大的作用,其实编译模块最终的结果--一个ko文件并不仅仅是你的模块源代码c文件经过编译器和链接器处理过后的结果,而是被genksyms插入了一些额外的数据,就是这些数据作为版本控制的依据起了很大的作用。简单来说就是genksyms分析模块源代码文件(编译预处理后的),将其中使用的函数,变量等抽出来,然后再为这些函数,变量中的每一个生成一个crc校验码,生成校验码输入就是函数的名称,参数类型以及变量的名称,类型等,然后这些crc校验和被写入一个.mod.c文件中,最终编译器和链接器将这个.mod.c文件和源代码文件一起编译和链接,最终生成的ko中就包含了这些由genksyms生成的crc校验和。
     当模块加载的时候,内核会逐一的抽出ko模块中的每一个符号以及其对应的crc校验码,然后和内核本身保存的该符号的crc校验码做比较,只要有一个符号的crc校验码不同就说明该模块的版本不正确,因为如果该模块确实是在当前内核版本下编译的,那么其符号的crc校验码将会和内核本身相应符号的crc校验码一致,毕竟它们的算法一样,输入信息也一样。

     以上的这种机制可以被用作一种动态的版本控制,比如动态链接库的版本控制,这样可以减轻库混乱带来的危害,我们需要作的仅仅是为每一个动态库生成一个类似.mod.c的文件,姑且称为.version.c,这个文件中包含所有引用接口的crc校验码以及引用接口本身,然后修改动态库的加载机制,增加版本检查相关的逻辑,也就是一个crc比对的逻辑。


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271152


相关文章
|
9天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
17天前
|
Linux Shell Windows
Linux如何检查文件夹的大小?
在Linux中查看文件夹大小,可使用`du`(如`du -sh *`)、`df`(如`df -h /home`)查看磁盘使用情况,`ncdu`提供交互式浏览,`ls -lh`显示当前目录文件大小,`find`与`du`结合找大文件夹,`tree --du -h`展示目录结构及大小,或用`awk`与`du`组合按大小排序。不同场景下,这些命令各有优势。
143 1
Linux如何检查文件夹的大小?
|
27天前
|
Shell Linux C语言
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
29 1
|
7天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
17 3
|
10天前
|
安全 Unix Linux
一、linux 常用命令之 linux版本信息 系统管理与设置 持续更新******
一、linux 常用命令之 linux版本信息 系统管理与设置 持续更新******
14 0
|
14天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
17天前
|
Linux 内存技术
Linux内核读取spi-nor flash sn
Linux内核读取spi-nor flash sn
13 1
|
23天前
|
存储 网络协议 Linux
【Linux 解惑 】谈谈你对linux内核的理解
【Linux 解惑 】谈谈你对linux内核的理解
22 0
|
23天前
|
监控 算法 Unix
【Linux 异步操作】深入理解 Linux 异步通知机制:原理、应用与实例解析
【Linux 异步操作】深入理解 Linux 异步通知机制:原理、应用与实例解析
56 0
|
23天前
|
开发框架 算法 Linux
【知识点回顾 】Qt信号槽与Linux信号处理 的处理机制 深入探讨
【知识点回顾 】Qt信号槽与Linux信号处理 的处理机制 深入探讨
33 0