编译的LKM的可互换性

时间:2013-01-09 15:57:53

标签: android linux-kernel arm cross-compiling kernel-module

是否可以使用可加载内核模块,在版本为3.0.8+ mod_unload ARMv5(android stock-kernel)的内核中为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,然后是内核崩溃:

  

&lt; 1&gt; [328.025360]无法处理内核NULL指针取消引用   虚拟地址00000061&lt; 1&gt; [328.025695] pgd = c1be8000&lt; 1&gt; [   [00000061] * pgd = 00000000&lt; 0&gt; [328.026184]内部错误:哎呀:5 [#1] PREEMPT SMP&lt; 4&gt; [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-phone(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

  4. 目前打开问题:

    1。)

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

    我手动编辑了.config,删除了ARMv5-line并添加了ARMv7-line(在.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)?我想我可以“忽略”特定的变体并使用common-kernel进行LKM编译?

    非常感谢碱度,auselen&amp; Marko此刻 - 你正在帮我摆脱困境。

2 个答案:

答案 0 :(得分:3)

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

  
    

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

  

答案 1 :(得分:1)

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

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

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

如果您有兴趣阅读有关加载内核模块的细节,那么IBM有一篇很棒的“解剖学”系列文章。这是loadable kernel modules。跳转到“模块加载详细信息”部分,了解内核在没有强制加载的情况下拒绝插入模块的原因。