【问题标题】:Loadable Kernel Module: Unknown symbol malloc_sizes (err 0)可加载内核模块:未知符号 malloc_sizes (err 0)
【发布时间】:2012-12-21 14:48:19
【问题描述】:

我为安卓开发了一个可加载内核模块(LKM)。

我用kzalloc:

device = kzalloc(ndevices * sizeof (*device), GFP_KERNEL);

它工作了一段时间,但在我的 android 更新后(因为 4.1 它不再工作),我在insmod 上收到以下错误:

insmod module.ko
insmod: init_module 'module.ko' failed (No such file or directory)

DMESG says:
Unknown symbol malloc_sizes (err 0)

这与inux/slab.h有关,这是我所知道的。

我在谷歌上搜索了好几天,我很沮丧没有找到解决此问题的解决方案并让 LKM 再次工作。

也许有人可以帮助我吗?

结论:

接受的答案是正确的:尝试删除slab.h 并将缺少的方法定义为“extern”。或者在您的内核源代码中,使用“make menuconfig”并将 SLAB 更改为 SLUB(有关详细信息,请参阅答案中的第一条评论)。

剩下的问题在一个新的、更具体的主题中处理:

Interchangeability of compiled LKMs

【问题讨论】:

    标签: android android-ndk malloc kernel-module


    【解决方案1】:

    所以你需要告诉我们内核版本。但是查找 linux 内核版本和内存分配器,似乎默认的主线内核从 SLAB 切换到了 SLUB。

    默认情况下,Linux 内核使用 SLAB 分配系统直到版本 2.6.23,当 SLUB 分配成为默认值时。

    除非您正在编写模块或依赖于 SLAB 的东西(这极不可能),否则您可能不希望包含 linux/slab.h 标头。

    【讨论】:

    • 我真的很高兴你的共鸣!我正在为内核版本 3.0+(较新的 android 设备)构建。我刚刚读到,我必须在启用 SLUB 的情况下重新制作内核 (armtvtech.com/armtvtechforum/viewtopic.php?f=66&t=604#p6149)。这意味着我只需要重新制作内核源代码,然后我的模块就可以工作了吗?我不会刷我的设备。只需删除#include 就会导致“函数'kzalloc'的隐式声明”。
    • results in "implicit declaration of function 'kzalloc'" 只需在模块头文件中声明原型即可。
    • 感谢您的回复。昨天我只是用 SLUB 而不是 SLAB 重新制作了内核源代码,并且该模块并没有为 malloc_sizes 哭泣(但它导致了内核崩溃 ^^)。今天晚上,我将尝试您的建议,并将 kzalloc/kzfree 定义为外部并删除slab.h-include。
    • 嗯,首先我用 SLUB 重建内核,而不是 SLUB -> kernel-panic AFTER module_init() (在打印 return 0 之前的最后一行的调试日志)。再次使用 SLAB 构建内核,写入 extern void *kzalloc(size_t, gfp_t); 并在 insmod 上删除了slab.h-inclusion -> Unknown symbol kzalloc (err 0)。我的目标设备具有内核 3.0.39 (OMAP Galaxy Nexus),而我使用的是通用内核 3.0.8,这应该可以工作,不是吗?
    • 你是专门用kzalloc的吗?如果没有看到您的消息来源,我不确定我是否真的可以提供更多建议。
    猜你喜欢
    • 2015-06-25
    • 2020-09-30
    • 1970-01-01
    • 2012-02-26
    • 2021-06-13
    • 2012-08-06
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多