加载为另一个内核编译的内核模块失败

加载为另一个内核编译的内核模块失败

我想在运行嵌入式 Linux 的嵌入式设备上加载内核模块ip_gre.kogre.ko,以使该设备支持 GRE 协议。由于我不想更改嵌入式 Linux 设备的内核,因此我尝试加载内核模块而不是重新安装设备内核。

幸运的是,我有该设备的内核源代码,因此我可以编译ip_gre.kogre.ko模块。但是,insmod在设备上使用加载模块失败并显示以下消息:

$ insmod gre.ko
insmod: can't insert 'gre.ko': Resource temporarily unavailable
$ insmod ip_gre.ko
ip_gre: Unknown symbol gre_del_protocol
ip_gre: Unknown symbol gre_add_protocol
insmod: can't insert 'ip_gre.ko': unknown symbol in module, or unknown parameter
$ dmesg
GRE over IPv4 demultiplexor drvier
gre: can't add protocol
ip_gre: Unknown symbol gre_del_protocol
ip_gre: Unknown symbol gre_add_protocol

我的设备有足够的内存来加载模块(free显示 190700/239760 是免费的)。

您能否告诉我为什么会发生这种情况以及可能的解决方案?

更新:

这些是.config(在设备上)运行内核与为上述两个模块编译的内核之间的差异。

$ diff config_for_running_kernel config_for_kernel_compiled_for_modules
299c299, 301
< # CONFIG_NET_IPGRE_DEMUX is not set
---
> CONFIG_NET_IPGRE_DEMUX=m
> CONFIG_NET_IPGRE=m
> CONFIG_NET_IPGRE_BROADCAST=y
963c965
< CONFIG_PPTP=y
---
> CONFIG_PPTP=m

由于CONFIG_PPTP依赖于CONFIG_NET_IPGRE_DEMUX,我必须将其作为模块来编译内核而不会出现错误消息。

这些差异是否会导致上述错误消息?如果是的话,你能告诉我如何解决吗...? (如果您有其他参考资料可以教我这些问题和解决方案,我将非常感激)

答案1

我通过分析和修改内核模块解决了这个问题。分析内核模块源代码表明,应关注兼容的内核选项来加载内核模块,正如 Gilles 所评论的那样。加载gre内核模块导致了该问题,因为现有pptp模块使用的协议 IDIPGRE_PROTO等于gre协议 ID。未gre启用模块的内核IPGRE_PROTO用作pptp协议 ID。

相关内容