如何从内核代码中加载内核模块?

时间:2017-01-25 08:17:11

标签: c linux-kernel kernel-module

这个问题与问题非常相似:How can Linux kernel modules be loaded from C code?

不同之处在于我想从内核代码中加载内核模块,而不需要去用户空间。

案例是我有两个内核模块,我应该动态加载和卸载。它们无法一起加载,我需要加载一个并尽快卸载另一个。告诉我哪一个加载或卸载的触发器来自硬件 这就是我想从内核中做到的原因。

2 个答案:

答案 0 :(得分:2)

要从内核中加载模块,请查看以下示例: http://lxr.free-electrons.com/source/net/netlink/genetlink.c#L915

拉米罗森

答案 1 :(得分:1)

我相信你不能直接这样做,但我可能错了。

我建议通过一些文件描述符(可能是一些socket(7)来编写一些进入某些用户空间应用程序(可能是systemd或您自己的守护程序)的数据,可能属于netlink(7)家庭。)

我不太了解所有细节,但我确实质疑从内核代码直接加载内核模块 的方法,因为内核模块已被发明为"增加& #34;来自用户土地应用程序的内核。如果您知道所需的确切内核代码,请考虑将所有内核代码链接在一起。另请参阅modprobe(8)

(你的问题需要一个具体的用例和一些动机;我不明白为什么你需要避免去用户空间;我想了解你正在考虑的实际内核模块,以及他们的确切角色是什么)

BTW,内核模块不应经常加载。如果必须这样做(例如,每隔几毫秒加载一个内核模块),则意味着您有设计错误。内核模块(或其中几个)通常被加载一次,并且当它无用时不应该干扰内核。因此,您应该改进整体设计,以避免需要经常卸载和重新加载内核模块。至少从概念上讲,您应该考虑在启动时加载所有内核模块并在关机时卸载它们(以适当的顺序)。

  

案例是我有两个内核模块,我应该动态加载和卸载。

这可能是巨大的架构设计错误的症状。这些是最昂贵的错误。您应该考虑预算几个月的努力来避免它。

可能你应该更多地描述[你的特定]内核模块之间的依赖关系。 AFAIK,modprobe命令管理这种依赖关系(例如,在没有首先卸载所需的依赖关系的情况下赢得了一个模块)

如果你正在设计&开发两个内核模块时,您应该考虑将它们合并到一个内核模块中(并为该任务预算几个月的工作量)。当然,您可能需要更改其" API",例如某些设备驱动程序或ioctl能够启用或禁用某些部分