是否可以使用可加载内核模块,在版本为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
不应该为所有ARM设备编译一个版本:
compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.39 ARMv7
它可能(目前未经测试!)可以在最低级别(ARMv5)上编译并在更高级别使用它(ARMv6,ARMv7)
compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.8 ARMv7
可以交换内核版本(可能是简单的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-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此刻 - 你正在帮我摆脱困境。
答案 0 :(得分:3)
您不能对不同版本的Linux使用相同的二进制驱动程序。
Linux没有二进制内核接口,也没有稳定的内核接口。 (source)
答案 1 :(得分:1)
不,这是不可能的。 Linux内核为architecture-specific,ARMv5模块与ARMv7不兼容。需要不同的头文件,它们将具有不同的指令集,或寄存器映射,或任意数量的重要变体。
无论如何,内核版本在这种情况下也是不同的,这意味着内核API可能会有所不同,因此即使架构是相同的,内核模块也不会全部工作。
您必须交叉编译内核模块的单独版本。如果您可以访问整个内核树,这并不难。制造商应该已经发布了他们的内核源代码(根据GPL)。如果他们没有,他们欠你的消息来源。
如果您有兴趣阅读有关加载内核模块的细节,那么IBM有一篇很棒的“解剖学”系列文章。这是loadable kernel modules。跳转到“模块加载详细信息”部分,了解内核在没有强制加载的情况下拒绝插入模块的原因。