modulename: loading out-of-tree module taints kernel

2023-11-03

问题描述

使用insmod命令加载编写的驱动模块时,出现提示信息:loading out-of-tree module taints kernel。不过,模块还是能够被加载。并且卸载后再次加载时,该提示信息没有再次出现。然而整个系统重启后再加载模块,仍然会出现该提示信息。也就是说,在linux的一次运行期间,加载自己编写的驱动模块时,出现了上述提示信息。

原因分析

提示信息中的taint污染的意思,整个提示信息的意思是加载树外模块污染内核。先简单说一下内核污染,当内核受到污染意味着内核处于社区不支持的状态,并且内核提供的某些功能可能会被禁用。此时,如果内核运行出现问题,内核开发者是不会理会的。

为什么要搞这样一个机制呢?简单点说,有一个对linux感兴趣的同学下载了kernel的源码并移植到自己的开发板上,然后自己写驱动,并加载到内核。之后的一个时间点,假如内核运行出现了问题,此时该同学是不应该向内核开发者反应问题的。因为很有可能内核本身没问题,而是这个同学自己写的驱动存在问题,导致了内核的崩溃。内核开发者仅仅只审核了位于内核源码树中的代码,因而只对源码树中的代码负责。换句话说,一个被污染的内核出现问题可能不是内核的bug;一个没有被污染的内核的错误报告更可能蕴含内核bug。有了这个机制,内核开发者就可以确定哪些错误报告是需要处理的,不然查半天发现不是自己的问题,这就耽误工夫了。

这里列部分内核被污染的原因:

  • 加载非GPL兼容的内核模块
  • staging驱动程序的使用,它们是内核源代码的一部分,但尚未经过全面测试
  • 使用内核源代码未包含的树外模块
  • 强制加载不是为当前内核版本构建的模块
  • 某些严重错误,例如machine check exceptions(MCE)和kernel oopses

显然,本文所述的内核被污染的原因是加载了树外模块,也就是加载自己写的驱动,不在内核源码树中。更多关于内核污染的信息,可以参考这个问答:What is a tainted kernel in Linux?

现在,我们再来思考一个问题,内核是怎么知道这个模块是树外的?对此,有人讨论过:Marking loadable kernel module as in-tree。这里我简单总结一下,我们在编译驱动模块的Makefile中使用M=$(PWD)来指定驱动源码所在的目录,内核的顶层Makefile在检查到M非空时,会设置KBUILD_EXTMOD变量,最终导致内核的编译体系不会在modulename.mod.c中添加MODULE_INFO(intree, "Y");,也就是说不会给我们自己的驱动打上属于树内的标记

解决方案

大多数情况下,我们可以忽略内核污染的情况,不能忽略的只是某些严重的系统问题导致的内核。事实上,尽管加载内核时会有上述提示,但终究成功加载了模块,驱动也能工作。

强迫症患者可能非要寻找一个解决方法,那么我们对症下药,可以使用这么几种解决方案:

  • 向内核提交patch,让内核的开发者将你的驱动并入内核源码树(对于只是学习驱动的情况,这个方法并不合适)
  • 自己把驱动程序拷贝到本地的源码树中,并自己添加相应的内核配置项,然后在树内编译驱动模块(保持M为空,这样做也挺麻烦的)
  • 自己在驱动源码种添加一句MODULE_INFO(intree, "Y");,以欺骗内核本模块为树内模块(最好不要这么搞)

综上,强迫症患者还是忍忍吧,对于自己学习驱动从而产生一些树外模块的情况,忽略上述提示信息就可以了^_^!!

最后的最后,我看到网上有同学说这个跟模块的签名有关,但就我找到的资料来看,好像不是这么回事,毕竟当前我并未启用linux内核中的模块签名验证:

# CONFIG_MODULE_SIG is not set

既然提到了模块签名,就再丢一个链接:Signed kernel module support。这里对模块签名有更多的说明,感兴趣的同学可以去看看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

modulename: loading out-of-tree module taints kernel 的相关文章

  • 论文阅读:CLIP2Video: Mastering Video-Text Retrieval via Image CLIP

    动机 之前的大多都是试图从大规模的视频文本数据集中提取视频的时空特征以及视频和语言之间的多模式交互 作者将在图像语言中预训练的模型迁移到视频文本检索任务中 而之前这种使用这种方式的工作大多都是基于证明这种迁移学习是有效的 以验证CLIP模型
  • [BABEL] Note: The code generator has deoptimised the styling of "unknown" as it exceeds the max of "

    BABEL Note The code generator has deoptimised the styling of unknown as it exceeds the max of 500KB babelrc文件添加 compact
  • 构建Python pandas基于SSH远程MySQL和PostgreSQL的数据分析

    如果您无法从外部环境直接访问数据库 则可能需要SSH隧道来查询它 在这篇文章中 我将向您展示如何通过SSH连接并查询MySQL数据库到Pandas数据框 可以将相同的代码应用于连接到其他数据库 例如PostgreSQL 假设您的数据库托管在
  • Spring 基础教程之一:Spring简介

    明天就要讲传说中的spring了 不知道它是否像老师说的那样简单且神奇 spring的英文翻译是春天 泉水 弹簧 活跃的意思 不知道像我们这样的距找工作还有50天左右的人来说 我们的春天是否到了 在这个春天我们是否能够喝上甘甜的泉水 然后像
  • aps是什么意思_全画幅大还是中画幅大? 为什么说底大一级压死人

    经典摄影教程 总第十期 书接上文 是什么造成了画面的 空间感 其中我们谈到了当我们使用不同焦距的时候 我们的拍摄距离往往也会改变 但是这个焦距说的就是等效焦距 在什么是等效焦距 一文中 也说了等效焦距是因为传感器大小不同产生的讨厌的东西 那
  • Redis零基础小白篇

    一 Redis概述 1 是什么 是存在内存中的数据库 是Key Value数据库 MySQL是关系数据库 2 能干什么 一个程序中大部分操作都是查询 少部分操作是写入 所以用MySQL作存储 Redis作查询 所有查询先查询Redis 没有
  • 用遗传算法(GA)做最优化:找一元及多元函数的最大值

    一元函数 对于如下图所示的一元函数求解其在区间 0 7 内的最大值有多种方式 在本文中分享的是用一种启发式算法 遗传算法来完成这项工作 大家对遗传算法不了解的话可以戳这里看简介 首先介绍我们的主角 也就是目标函数的形式 其定义如下 def
  • Drools规则引擎入门学习记录

    业务开发过程中 对于某些判断性的通用规则是基于if else封装 还是基于策略模式封装 无论以上那种封装出来的方法 只能在单体软件包中共用 且不能无感部署 然而对于业务而言 可能规则改变的比较频繁 例如与营销有关的活动 会频繁的修改商品价格
  • (css必看)禁止用户拖动,禁止选中复制,禁止输入框输入

    目录 特殊的css 下面每一个都必须了解 1 user select属性可以设置是否允许用户选择页面中的图文内容 2 user drag属性可以设置是否允许页面元素拖拽 3 user modify属性可以设置是否允许输入框输入内容 特殊的c
  • xmlHttpRequest的status的值的含义

    转自 http www cnblogs com zhubaoxu archive 2008 03 17 1109315 html 虽然常写ajax方面的东西 但是很少去专门了解xmlHttpRequest的status各个值的含义 只是在用
  • C语言基础知识--static 关键字

    目录 一 static 修饰全局变量 二 static 修饰局部变量 三 static 修饰函数 一 static 修饰全局变量 此用法多出现在由多个源文件组成的项目中 static修饰表示该变量只可在定义该变量的文件下访问该static变
  • MinGW安装教程

    前言 本文主要讲述如何安装 C语言 编译器 MinGW 特点是文章附有完整详细的实际安装过程截图 文字反而起说明提示作用 编写本文的原因始于我的一个观点 图片可以比文字传达更多的信息 也能让其他人更容易理解作者的意图及思想 因此 我将安装
  • luckysheet内网(离线)使用

    luckysheet内网 离线 使用 需要先把有关联网引用的文件 搞下来 const dependScripts https cdn jsdelivr net npm vue 2 6 11 expendPlugins chart onlin
  • [Unity 3D] 求两个向量间的夹角的方法

    1 Vector3 d1 transform forward Vector3 d2 new Vector3 0 3 0 float angle Vector3 Angle d1 d2 2 Vector3 d1 transform forwa
  • 微信小程序实现js控制动画——点击播放动画

    功能需求 点击刷新图标 图标旋转进入Loading状态 加载完毕 动画停止 index wxml
  • JAVA中 IO输入输出流的基本用法和文件复制的案例

    IO 即in和out 也就是输入和输出 指应用程序和外部设备之间的数据传递 常见的外部设备包括文件 管道 网络连接 Java 中是通过流处理IO 的 那么什么是流 流 Stream 是一个抽象的概念 是指一连串的数据 字符或字节 是以先进先
  • npm .npmrc作用

    在执行npm install g cordova ionic时出错 可以修改npm源 npm全名Node Package Manager npmrc文件的作用 就是配置npm源 该文件在C盘用户文件目录下 eg 淘宝源 registry h
  • ORCAD 16.6使用说明及技巧

    1 元器件基本操作 R 翻转 H 左右镜像 V 上下镜像 I 放大视图 O 缩小视图 2 选中工程根文件夹 点击Edit Browse Parts Nets等可查看所有信息 3 元件属性 白色 instance 平坦式 黄色 occuren
  • socket原理以及socket的简单实现

    目录 一 socket学前基础 TCP的三次握手和四次挥手 二 为什么要使用socket 三 什么是socket 四 socket的简单代码实现 服务端 客户端 一 socket学前基础 TCP的三次握手和四次挥手 1 服务端和客户端如果想

随机推荐

  • python怎么绘制渐变图_有没有一种使用Python生成渐变位图的简单方法?

    实现这一点的一种方法是使用matplotlib 正如您在标记中建议的那样 为了做到这一点 我会的使用numpy创建一个NxN数组来表示image gradient 在 创建一个figure 其大小以英寸为单位与圆的半径 image circ
  • 浏览器console几种报错类型

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 SyntaxError 语法错误 2 TypeError 类型错误 通常是 is not a function 即 不是一个函数 3 ReferenceError 引用
  • 开启电脑虚拟化功能

    一 查看笔记本是否支持虚拟化 打开任务管理器 同时摁住ctrl alt del这个三个健 选择任务管理器 查看是否开启虚拟机 如果未开启 一 进入BIOS 参考以下按键 开机时按住对应的键进入BIOS 组装机以主板分 华硕按F8 Intel
  • 最强自动化测试框架Playwright-(2)元素定位

    元素定位 定位器是playwright自动等待和重试功能的核心部分 简而言之 定位器表示一种随时在页面上查找元素的方法 Locators Playwright Python 如下这些是推荐的 page get by role 按显式和隐式辅
  • 关于window.open()方法 返回的的打开的新窗口的对象

    关于window open 方法 返回的的打开的新窗口的对象
  • Dump libasound 音频数据

    QNX有如下两种方法dump pcm数据 可以录声卡之前的数据 1 QNX自带的pcm logger工具 工具位置 qnx qnx sdp target qnx7 aarch64le usr bin pcm logger 打开pcm dum
  • 计算机网络-运输层

    To 个人主页 关注不迷路 运输层 重要概念 运输层为相互通信的应用进程提供逻辑通信 端口和套接字的意义 无连接的 UDP 的特点 面向连接的 TCP 的特点 在不可靠的网络上实现可靠传输的工作原理 停止等待协议和 ARQ 协议 TCP 滑
  • 蓝桥杯:外卖店优先级(map排序算法) Java

    分析 发现只是输入两种数据 则可以考虑用map 经过分析发现 可以用店家编号来表示map的第一个参数Integer 第二个参数因为有可能有多个相同的时刻 所以用arraylist
  • 一, SpringCloud Alibaba-nacos注册中心

    1 nacos官网 https nacos io zh cn https nacos io zh cn docs what is nacos html https github com alibaba spring cloud alibab
  • c++拷贝与引用讲解

    目录 拷贝与引用 2 const限定符 3 const与指针 拷贝与引用 1 拷贝 即复制 在初始化变量时 初始值会被拷贝到新建的对象中 对象会开辟一块新的内存空间用来存储该变量 int a 10 int b a std cout lt l
  • 广播到底啥啊,arp广播原理

    1网络广播 网络广播是指一个节点同时向相同域中的其它所有节点传输数据包的过程 例如 有4台主机 分别为1号主机 2号主机 3号主机 4号主机 假如1号主机 要给4号主机发数据 如果是用广播传输方法的话 那么4台主机都会收到数据包 4台主机
  • ChatGpt 从入门到精通

    相关资源下载地址 基于ChatGPT的国际中文语法教学辅助应用的探讨 pdf 生成式人工智能技术对教育领域的影响 关于ChatGPT的专访 pdf 电子 从ChatGPT热议看大模型潜力 pdf 从图灵测试到ChatGPT 人机对话的里程碑
  • Python爬虫-使用Selenium模拟百度登录

    前言 前面我已经安装好了Selenium并模拟成功了一下打开百度页面并进行查询 让我这个python初学者信心倍增 今天再来试一试百度登录 正文 把打开百度的代码放到构造方法中 ps 那个文件目录是用于后面滑块验证图片保存的 def ini
  • linux最简单预览摄像头方法

    我只想要打开摄像头 想当然就是用ffplay centos如何安装ffplay 找了一通都是编译安装 编译安装也就算了 竟然没有生成ffplay 搜了一通解决ffmpeg编译安装没有生成ffplay的教程 累了 我到底在干什么 linux真
  • FatFs目录访问接口中文版

    我是阿荣 关注我 在技术路上一起精进 目录访问 f opendir 打开目录 函数原型 FRESULT f opendir DIR dp OUT Pointer to the directory object structure const
  • Vue-Axios的封装---登录注册---axios(二)

    Vue cli Axios的封装 简单的的登录与注册 第一种 逻辑数据未分离 注册 登录 用户页面获取用户数据信息以及注销 第二种 逻辑数据分离 token 封装Axios 为什么封装axios 实现 调用封装完毕的Axios 并在添加所需
  • vuforia sdk及案例 (第二章)

    有过上一章了现在去看下载部分 我事先下载好了 用的Android Q版本 开发软件版本是3 5 3的 然后我看了一去升级到了3 6 1 我是最新版本来做的 这是我下载的 导入工程案例 VuforiaSamples 8 6 10 出现问题一
  • IntelliJ IDEA开发工具的安装,scala插件安装

    IntelliJ IDEA开发工具安装 scala插件安装 1 IntelliJ IDEA开发工具下载 下载官方网址 https www jetbrains com idea download other html 我下的2021 3 2
  • Pytorch Advanced(一) Generative Adversarial Networks

    生成对抗神经网络GAN 发挥神经网络的想象力 可以说是十分厉害了 参考 1 AI作家 2 将模糊图变清晰 去雨 去雾 去抖动 去马赛克等 这需要AI具有 想象力 能脑补情节 3 进行数据增强 根据已有数据生成更多新数据供以feed 可以减缓
  • modulename: loading out-of-tree module taints kernel

    问题描述 使用insmod命令加载编写的驱动模块时 出现提示信息 loading out of tree module taints kernel 不过 模块还是能够被加载 并且卸载后再次加载时 该提示信息没有再次出现 然而整个系统重启后再