3

是否可以在具有版本(android stock-kernel)的内核中使用为3.0.8+ mod_unload ARMv5(我的自制内核)编译的可加载内核模块?3.0.31-gd5a18e0 SMP preempt mod_unload ARMv7

模块本身几乎什么都没有,只是

// Defining __KERNEL__ and MODULE allows us to access kernel-level code not usually available to userspace programs.
#undef __KERNEL__
#define __KERNEL__

#undef MODULE
#define MODULE

// Linux Kernel/LKM headers: module.h is needed by all modules and kernel.h is needed for KERN_INFO.
#include <linux/module.h>    // included for all kernel modules
#include <linux/kernel.h>    // included for KERN_INFO
#include <linux/init.h>        // included for __init and __exit macros

MODULE_AUTHOR("martin");
MODULE_LICENSE("GPL");

static int __init hello_init(void)
{
    //printk(KERN_INFO "Hello world!\n");
    return 0;    // Non-zero return means that the module couldn't be loaded.
}

static void __exit hello_cleanup(void)
{
    //printk(KERN_INFO "Cleaning up module.\n");
}

module_init(hello_init);
module_exit(hello_cleanup);

我正在强制使用 insmod,但随后内核崩溃:

<1>[ 328.025360] 无法处理虚拟地址 00000061 处的内核 NULL 指针取消引用 <1>[ 328.025695] pgd = c1be8000 <1>[ 328.025848] [00000061] *pgd=00000000 <0>[ 328.026184] 内部错误:Oops: 5 [#1] PREEMPT SMP <4> [328.026519] 模块链接在:airstream_interceptor(+)

我用

CROSS_COMPILE=/home/adminuser/WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
KDIR    ?= /home/adminuser/WORKING_DIRECTORY/android-3.0
ARCH=arm

用于构建内核和现在构建模块。但是应该插入它上面的系统使用它自己的工厂内核。

我尝试构建一个可用于多个 android 手机(arm、armv5、armv7 等)的内核模块,但我想对所有手机都使用 1(如果可以的话)。

(编辑)

结论#1

  1. 不可能为所有 ARM 设备编译一个版本:

    compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.39 ARMv7

  2. 它可能(目前未经测试!)可以在最低级别(ARMv5)上编译并在更高级别(ARMv6,ARMv7)上使用它

    compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.8 ARMv7

  3. 可以交换内核版本(如果是简单的 LKM)

    compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.39 ARMv5

目前开放的问题:

1.)

我尝试(使用 common-kernel 3.0.8 和 omap-kernel 3.0.39)为 ARMv7 构建,但结果始终是 ARMv5-LKM。

我手动编辑了 .config,删除了 ARMv5 行并添加了 ARMv7 行(在 .config 中没有):

#CONFIG_CPU_32v5=y # I added the #
CONFIG_CPU_V7=y # didn't exist 
CONFIG_CPU_32v7=y # didn't exist 

但是如果我在内核源代码上重新运行“make”,文件会自动编辑,我的 v7-config 会被删除。几个月前,我记得这没问题,我只是添加了 2 行,它就起作用了。

这是内核源代码还是使用的工具链的问题?

2.)

鉴于 LKM 构建,例如“omap-kernel”和“common-kernel”之间有什么区别?只是另一个内核版本(例如,common-kernel 现在有 3.0.53 和 omap-kernel 3.0.39)?我认为我可以“忽略”特定变体并使用通用内核进行 LKM 编译?

非常感谢目前的碱度、auselen 和 Marko - 你正在帮助我摆脱困境。

4

2 回答 2

3

不同版本的 Linux 不能使用相同的二进制驱动程序。

Linux 没有二进制内核接口,也没有稳定的内核接口。(来源

于 2013-01-09T19:12:34.450 回答
1

不,这是不可能的。Linux 内核是特定于体系结构的,ARMv5 模块与 ARMv7 不兼容。需要不同的头文件,它们将具有不同的指令集、寄存器映射或任意数量的重要变体。

无论如何,在这种情况下内核版本也不同,这意味着内核 API 可能会有所不同,因此即使架构相同,内核模块也很有可能无法工作。

您必须交叉编译内核模块的不同版本。如果您可以访问整个内核树,这并不太难。制造商应该已经发布了他们的内核源代码(根据 GPL)。如果他们没有,他们欠你的资源。

如果您有兴趣阅读加载内核模块的细节,IBM 有一个很棒的“解剖”系列文章。这是关于可加载内核模块的。跳转到“模块加载详细信息”部分以了解为什么内核拒绝在没有强制加载的情况下插入您的模块。

于 2013-01-09T16:13:32.673 回答