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比对的逻辑。

linux内核引入模块机制好处,linux内核模块的版本检查机制相关推荐

  1. linux内核引入模块机制,Linux内核设备驱动之Linux内核模块加载机制笔记整理

    #include 1. 模块参数 在驱动定义变量 static int num = 0; //当加载模块不指定num的值时则为0 module_param(变量名, 类型, 权限);类型: byte, ...

  2. linux 内核可装载模块 版本检查机制

    为保持 Linux 内核的稳定与可持续发展,内核在发展过程中引进了可装载模块这一特性.内核可装载模块就是可在内核运行时加载到内核的一组代码.通常 , 我们会在两个版本不同的内核上装载同一模块失败,即使 ...

  3. Linux内核中的vfs,解析 Linux 中的 VFS 文件系统机制

    在Linux系统中,每个分区都是一个文件系统,都有自己的目录层次结构.Linux的最重要特征之一就是支持多种文件系统,这样它更加灵 活,并可以和许多其它种操作系统共存.由于系统已将Linux文件系统的 ...

  4. Linux内核LED模块分析(二)

    Linux内核LED模块分析(二) 上次分析到那里后,还是有些同志说看不懂,那我就继续分析一把我认为不需要继续分析的东西吧.上回分析了 led_cdev和trigger的关系后就没有继续说了.有同志还 ...

  5. Linux内核态之间进程通信,Linux 系统内核空间与用户空间通信的实现与分析[转载]...

    [https://www.ibm.com/developerworks/cn/linux/l-netlink/index.html] 多数的 Linux 内核态程序都需要和用户空间的进程交换数据,但 ...

  6. linux内核分为四个子系统,linux操作系统的内核有哪几个子系统构成,简要说明各子系统的作用...

    Linux是一个一体化内核(monolithic kernel)系统."内核"指的是一个提供硬件抽象层.磁盘及文件系统控制.多任务等功能的系统软件.一个内核不是一套完整的操作系统. ...

  7. linux内核编译最详细,Linux内核编译详细教程,linux内核编译

    Linux内核编译详细教程,linux内核编译 尝试编译下Linux-kernel 4.14.14,使用Ubuntu 16.04 64位 系统. kernel-4.14.14 内核文件约96MB,解压 ...

  8. linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......

    课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...

  9. Linux内核编程(二)-----------Linux内核初探

    写在前面:本篇主要介绍Linux内核的开发模式.linux代码的组成.vmlinux  zImage  uImage的区别,以及编译下内核. 正文: 一.Linux内核的开发模式 1.git:是一个分 ...

最新文章

  1. 我的一个rsync的包装
  2. access month函数用法_学会了这7个EXCEL日期函数技巧,老板再让你加班,你找我!...
  3. 基于jquery响应式网站图片无限加载瀑布流布局
  4. centos mysql lujin_MySQL中文转换成拼音的函数[zt]
  5. C#基础第六天-作业-利用面向对象的思想去实现名片
  6. cmake导入so库_(转)HelloWorld CMake CMake中构建静态库与动态库及其使用
  7. c lua语言教程,Lua教程(三):C语言、C++中调用Lua的Table示例
  8. Buffer的基本用法
  9. A Game of Thrones(104)
  10. 抖音的推荐算法是怎样的?
  11. android获取ion信息,[RK3288][Android6.0] ION 流程和使用小结
  12. NGS测序嵌合体是个需要去除的错误扩增序列
  13. Linux笔记 No.24---(curl、ip、nmcli、网卡/主机名/DNS配置文件、常见网络问题诊断、网络诊断工具:ping/nmap/tcpdump)
  14. 3.2.2对中文的考察2
  15. css3设置div边角是圆角
  16. 鲁大师 性能测试 计算机重启,电脑老自动重启,特别是鲁大师温度压力测试一开就自动重启是为什么?...
  17. 计算机绘图户型设计摘要,【室内设计论文】学生对室内设计教学课程知识的掌握(共2973字)...
  18. 用python求解:用户分别输入外援半径和内圆半径,计算圆环的面积;及用户分别输入圆柱的底面圆半径和高,输出圆柱和表面积。(附带源码)
  19. mysql-5.7.21-winx64.zip安装教程
  20. Mac如何找到和清理微信与QQ的文件和照片?

热门文章

  1. python 数据分析学习笔记 (第三章)
  2. echarts实时更新数据_虎牙为S10拼了8.0年度更新!随时回放实时数据,还能养柴犬...
  3. 表白编程代码python_python抖音表白程序源代码
  4. matlab从入门到精通-matlab计算机仿真与蒙特卡洛法【数学建模】
  5. 产品运营必须知道的几个概念,什么是用户群体?
  6. 深度学习核心技术精讲100篇(三)-层次自适应的多臂老虎机决策算法 ( HATCH )在滴滴中的应用
  7. tableau必知必会之学做直观的华夫饼图(Waffle Chart)
  8. MySQL关系数据库
  9. 放授权代码的php文件夹,自己的项目如果包含别人的开源代码,licence文件应放在哪里...
  10. elasticsearch index、create和update的源码分析