内核模块如何卸载自身而不在内核日志中生成错误?

2024-01-01

我制作了一个简单的模块,可以在加载时打印 GDT 和 IDT。当它完成工作后,就不再需要它并且可以卸载。但如果它返回负数以停止加载,insmod会抱怨,并且错误消息将记录在内核日志中。

内核模块如何优雅地卸载自身?


据我所知,使用库存内核是不可能的(您可以按照我在下面描述的方式修改模块加载器核心,但这可能不是一个值得依赖的好东西)。

好的,我看了一下模块加载和卸载代码(kernel/module.c http://lxr.free-electrons.com/source/kernel/module.c)以及一些名字非常可疑的用户module_put_and_exit http://lxr.free-electrons.com/ident?i=module_put_and_exit。似乎没有内核模块可以完成您想做的事情。它们都在模块上下文中启动 kthreads,然后在完成某些操作后终止 kthreads(它们不会自动卸载模块)。

不幸的是,该函数负责卸载大部分模块(free_module http://lxr.free-electrons.com/ident?i=free_module) 是静态定义的kernel/module.c。据我所知,没有导出函数会调用free_module从模块内。我觉得这可能是有原因的(尝试从模块内部卸载模块很可能会导致页面错误,因为包含模块代码的页面需要被释放)。虽然这可能可以通过制作来解决noreturn函数只是schedule防止当前(无效)任务再次运行(或只是运行do_exit).

进一步要问的一点是:您确定要这样做吗?为什么不直接编写一个 shell 脚本来加载和卸载模块,然后就到此为止了呢?根据我的喜好,自动卸载模块可能有点太接近天网了。

编辑:如果您同意修改模块加载器核心,我已经对此进行了一些尝试,并找到了一种方法来做到这一点。将此功能添加到kernel/module.c,并进行必要的修改include/linux/module.h:

/* Removes a module in situ, from within the module itself. */
void __purge_module(struct module *mod) {
        free_module(mod);
        do_exit(0);

        /* We should never be here. */
        BUG();
}
EXPORT_SYMBOL(__purge_module);

调用这个__purge_module(THIS_MODULE)将卸载您的模块并且不会导致页面错误(因为您不会返回到模块的代码)。但是,我仍然不建议这样做。我已经做了一些简单的容量测试(我使用此函数插入​​了一个模块约 10000 次,以查看是否存在任何资源泄漏 - 据我所知没有任何资源泄漏)。

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

内核模块如何卸载自身而不在内核日志中生成错误? 的相关文章

  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • 使用sk_buff添加以太网帧头

    我有一个捕获传出互联网流量的内核模块 Netfilter hook LOCAL OUT 在此挂钩处 仍然没有以太网标头 我构建了以太网头并且可以使用了 但是如何将其连接到skb这样我就可以将整个 skb 结构发送到dev queue xmi
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 模块参数权限

    我是内核编程的新手 当我正在经历module param 我对权限值 0 感到困惑 有人解释说它不会在 sysfs 中获得条目 而其他人则喜欢S IRUGO将获得一个条目 我无法理解这个概念 perm 值 0 表示什么 我们什么时候需要 s
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • Python 正则表达式中的重音字符

    这是我的代码 coding utf 8 import json import re with open Users paul Desktop file json as json file file json load json file p
  • SwiftUI TextField 在 ZStack 内的 VStack 中禁用(用 TextField 模拟警报)

    我需要发出警报SwiftUI有一个可编辑的文本域在里面 目前 SwiftUI 不支持此功能 截至Xcode 11 3 所以我正在寻找解决方法 我知道我可以通过将普通的 UIKit 位包装在UI托管控制器 但确实想坚持使用全 SwiftUI
  • 如何在JS中设置div内的值

    我有一些代码看起来像这样 document getElementById error style display block 当发生这种情况时 我还想显示应该显示的错误 该错误存储在另一个 JS 变量中 如何将该变量的值添加到 id err
  • CUFFT:当输入是倾斜数组时如何计算 fft

    我正在尝试查找动态分配数组的 fft 使用以下命令将输入 数组从主机复制到设备cudaMemcpy2D 然后进行 fft cufftExecR2C 并将结果从设备复制回主机 所以我最初的问题是如何在 fft 中使用音高信息 然后我在这里找到
  • 如何删除 php 帖子中的攻击性词语?

    假设 xyza 是一个坏词 我正在使用以下方法来替换攻击性词语 text str replace x Offensive words detected removed text 此代码会将 xyza 替换为 检测到并删除攻击性词语 但问题是
  • 调试本地 IIS Web 服务器上托管的 ASP.NET MVC3 应用程序

    我已经设法使用本地 IIS Web 服务器来托管我的 MVC3 应用程序 并且我可以调试它和所有内容 从托管它的机器 但是 当我从另一台计算机 我的 Mac 在 Parallels VM 中运行 Windows 发送请求时 我得到了预期的结
  • 将列表转换为一行 data.frame

    我有一个这样的列表 arg0 lt list code a n rep 10 3 列表中的对象数量是可变的 列表的对象是向量 只是一维对象 我想制定一个过程将列表转换为单行 data frame 如下所示 gt data frame cod
  • 基于 Term 的对象化数组

    我有这个数组 ary1d new Size Sym ArySym Ary functor Ary ArySym Size forall arg X Ary nb setarg X Ary Sym ary1d get Pos Ary Val
  • 为什么 cin 命令在缓冲区中留下“\n”?

    这与 cin 和 getline 跳过输入 https stackoverflow com questions 10553597 cin and getline skipping input但他们没有回答为什么会发生这种情况 只是回答如何解
  • Eclipse (STS)、Maven 和 maven-minify-plugin,它们可以一起工作吗?

    我正在做一个项目 负责 html css 和 javascript 我找到了这个maven minify 插件 http code google com p maven samaxes plugin这似乎正是我想要的 当我在服务器上使用 m
  • 计算多个字符串列中字符串的出现次数

    我有一个名为的数据框df看起来与此类似 除了 mat deliv 列的数量上升到 mat deliv 8 之外 还有数百个客户端和许多其他列Client ID and mat deliv 1 我在这里简化了它 Client ID mat d
  • int x = 'fooo' 是编译器扩展吗?

    我见过并使用过如下的 C 代码 int myFourcc ABCD 它可以在最新版本的 GCC 中运行 不确定有多新 标准中有此功能吗 这叫什么 我在网上搜索它时遇到了困难 EDIT 我也为未来的观察者找到了此信息 from 海湾合作委员会
  • Helm 图表如何具有值包含 {{ }} 的属性

    在 Helm Chart 中 我们可以将 value 定义为类似 Values name 的形式 它将被 Values yaml 中定义的实际值替换 但是 如果原始值具有类似的格式 例如 name 则在尝试安装该图表时 会由于 name 未
  • 将对象数组转换为对象值数组

    我正在尝试转换这个数组 let orders amount 100 user admin date March 6 2019 amount 120 user admin date March 6 2019 amount 80 user ad
  • 我可以通过编程方式控制 .NET Core 程序集重定向吗?

    问题 NET Core 2 0 netstandard 2 0 中是否有任何方法可以应用给定中未定义的程序集重定向application exe config运行可执行文件时的文件 也许某种编程方式 或者甚至通过使用一些特殊设置 标志运行可
  • 你可以同时运行 Coldfusion 和 PHP [重复]

    这个问题在这里已经有答案了 可能的重复 是否可以在同一服务器和网站上运行 Coldfusion 和 PHP https stackoverflow com questions 2444598 is is possible to run co
  • iOS 上的 Firebase Crashlytics 设置?

    我正在尝试集成 Firebase崩溃解决方案进入 iOS 我的应用程序 该应用程序启用了 Firebase 崩溃报告 我已按照文档进行操作here https firebase google com docs crashlytics upg
  • 老问题,如何确定不规则形状中的点?

    我学习 Html5 Canvas 有几个星期了 但是上面的问题困扰了我很长时间 不规则的形状 可能是圆形 矩形 椭圆形 多边形 或者由一些直线和贝塞尔曲线构造的路径 我找到了一些针对某些形状的算法 例如圆形 矩形和多边形 但是 如果我在画布
  • 带有打字稿的 nextjs API,将 NextApiRequest 查询参数限制为字符串类型[重复]

    这个问题在这里已经有答案了 在这个端点处理程序中 有没有办法限制req query在 NextJS 中NextApiRequest只是string类型而不是string string 例如 someQueryParam这里是string s
  • 内核模块如何卸载自身而不在内核日志中生成错误?

    我制作了一个简单的模块 可以在加载时打印 GDT 和 IDT 当它完成工作后 就不再需要它并且可以卸载 但如果它返回负数以停止加载 insmod会抱怨 并且错误消息将记录在内核日志中 内核模块如何优雅地卸载自身 据我所知 使用库存内核是不可