是否有可能使用可加载内核模块,它是为3.0.8+ mod_unload ARMv5 (我自己制造的内核)编译在一个版本3.0.31-gd5a18e0 SMP preempt mod_unload ARMv7 (AndroidStock-内核)的内核中的吗?
模块本身几乎什么都不包含,只是
// 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);我在强迫这个不和谐,但是接着内核崩溃了:
<1> 328.025360无法在虚拟地址00000061 <1> 328.025695 pgd = c1be8000 <1> 328.025848 *pgd=00000000 <0> 328.026184处处理内核空指针取消引用Oops: 5 #1抢占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用于构建内核和现在构建模块。但是它上的系统应该插入,使用它自己的工厂内核。
我试图构建一个内核模块,它可以在多个安卓手机(arm、armv5、armv7等)上使用,但我想为所有人使用1(如果可以的话)。
(编辑)
结论1
compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.39 ARMv7。compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.8 ARMv7compile LKM for kernel 3.0.8 for ARMv5 and use it on a kernel 3.0.39 ARMv5目前有以下公开问题:
1.)
我尝试(使用通用内核3.0.8和omap-内核3.0.39)构建ARMv7,但结果总是一个ARMv5-LKM。
我手动编辑了.config,删除了ARMv7 5-行,并添加了ARMv7 7行(在.config中没有):
#CONFIG_CPU_32v5=y # I added the #
CONFIG_CPU_V7=y # didn't exist
CONFIG_CPU_32v7=y # didn't exist 但是如果我然后在内核源代码上重新运行"make“,文件get会自动编辑,我的v7-config将被删除。几个月前,我记得这是没有问题的,我只是增加了2行,这是有效的。
这是内核源文件还是使用的工具链?
2.)
考虑到LKM的构建,例如“omap-内核”和“公共内核”之间有什么区别?只是另一个内核版本(例如,通用内核现在有3.0.53和omap-内核3.0.39)?我认为我可以“忽略”特定的变体,并使用公共内核进行LKM编译?
非常感谢碱度,奥塞伦和马科在此刻--你在帮我走出泥潭。
发布于 2013-01-09 16:13:32
不,这不可能。Linux内核是特定于建筑,ARMv5模块与ARMv7不兼容。需要不同的头文件,它们将具有不同的指令集、寄存器映射或任意数量的重要变体。
无论如何,内核版本在这种情况下也是不同的,这意味着内核API可能会有所不同,因此内核模块可能无法工作,即使架构是相同的。
您将不得不交叉编译不同版本的内核模块。如果您可以访问整个内核树,这并不太困难。制造商应该已经发布了他们的内核源(按照GPL)。如果他们没有,他们欠你消息来源。
如果您对加载内核模块的细节感兴趣,那么IBM有一个很好的“解剖”系列文章。这是可加载内核模块上的节目。跳到“模块加载详细信息”一节,了解为什么内核拒绝在没有加载力的情况下插入模块。
发布于 2013-01-09 19:12:34
对于不同版本的Linux,您不能使用相同的二进制驱动程序。
Linux没有二进制内核接口,也没有稳定的内核接口。(来源)
https://stackoverflow.com/questions/14241174
复制相似问题