如何在 C/C++ 程序中加载内核模块

Posted

技术标签:

【中文标题】如何在 C/C++ 程序中加载内核模块【英文标题】:How to load kernel modules in C/C++ program 【发布时间】:2016-02-14 16:51:18 【问题描述】:

我正在使用 ds18b20 温度传感器,并且正在将一些 python 代码转换为 c++ 以帮助更好地学习该语言。我遇到了需要加载 w1-gpio 和 w1-therm 模块的问题。我发现很多关于堆栈溢出的事情都提到应该使用 init_module,并且在同一个线程中,其他人提到使用fork()exec()。经过大量的谷歌搜索和阅读手册页后,我找不到任何关于如何完成这些任务的示例。有人可以指出和/或举例说明我将如何使用这两种方法中的任何一种加载这两个模块吗?或者提供一个不涉及 system("modprobe w1-gpio") 的替代方案?

uname -a

产生:

Linux raspberrypi 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7l GNU/Linux

【问题讨论】:

最简单的解决方案肯定是system("modprobe w1-gpio")或类似的东西。 检查modprobe 的源代码以了解它是如何工作的并(完全不必要地)在您的程序中复制功能。 【参考方案1】:

我仍然认为system("modprobe ...") 是解决这种情况的完美解决方案。这样做只会给自己带来额外的问题。

如果您确切知道要加载哪些内核模块,则使用init_module 或它的兄弟finit_module。但是您需要以正确的顺序加载模块。当然,还需要了解保存文件的所有相关位置、需要哪些参数等。

当您自己清理时,不要忘记将delete_module 的顺序颠倒过来。

modprobe和朋友的来源可以在这里找到: https://github.com/vadmium/module-init-tools

insmod 很短,但 modproble 代码只有 2300 多行。

【讨论】:

首选/sbin/modprobe,而不是直接调用modprobe。这可以保护您免受攻击,其中有人放置一个名为 modprobe 的二进制文件,该二进制文件以 root 身份执行恶意操作,然后调用真正的 modprobe

以上是关于如何在 C/C++ 程序中加载内核模块的主要内容,如果未能解决你的问题,请参考以下文章

内核模块编译实验

内核模块编译过程摘要记录

如何调试 Linux 内核模块 `init()` 中的问题?

20135327--linux内核分析 实践二

.o如何嵌入kernel

linux 实践2.2 编译模块