是否有可能,使用一个可加载的内核模块,编译为3.0.8+ mod_unload ARMv5
(我的自制内核)在一个内核版本3.0.31-gd5a18e0 SMP preempt mod_unload ARMv7
(android股票内核)?
模块本身几乎不包含任何内容,只有
// 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]无法处理内核NULL指针的解引用虚拟地址00000061 <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
不应该为所有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和map-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)。
在构建lkm时,"omap-kernel"one_answers"common-kernel"有什么区别?只是一个其他的内核版本(例如common-kernel现在有3.0.53和omap-kernel 3.0.39)?我想我可以"忽略"特定的变体,并使用lkm编译的共同内核?
多亏了碱性,auselen &马尔科,你现在是在帮我走出泥潭。
不能在不同版本的Linux上使用相同的二进制驱动程序。
Linux没有二进制内核接口,也没有稳定的内核接口。(源)
不,这不可能。Linux内核是特定于体系结构的,ARMv5模块与ARMv7不兼容。需要不同的头文件,它们将有不同的指令集,或寄存器映射,或任何数量的重要变体。
在任何情况下,内核版本在这种情况下也是不同的,这意味着内核API可以变化,因此内核模块将无法在所有的可能性,即使架构是相同的。
你必须交叉编译你的内核模块的不同版本。如果您可以访问整个内核树,这并不太难。制造商应该已经发布了他们的内核源代码(根据GPL)。如果他们没有,他们欠你的来源。
如果您对加载内核模块的细节感兴趣,IBM有一个很棒的"剖析"系列文章。这是一个可加载的内核模块。跳到"模块加载细节"一节,了解为什么内核拒绝在没有强制加载的情况下插入模块。