首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译LKM的互换性

编译LKM的互换性
EN

Stack Overflow用户
提问于 2013-01-09 15:57:52
回答 2查看 1K关注 0票数 3

是否有可能使用可加载内核模块,它是为3.0.8+ mod_unload ARMv5 (我自己制造的内核)编译在一个版本3.0.31-gd5a18e0 SMP preempt mod_unload ARMv7 (AndroidStock-内核)的内核中的吗?

模块本身几乎什么都不包含,只是

代码语言:javascript
复制
// 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(+)

我使用

代码语言:javascript
复制
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

  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.)

我尝试(使用通用内核3.0.8和omap-内核3.0.39)构建ARMv7,但结果总是一个ARMv5-LKM。

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

代码语言:javascript
复制
#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编译?

非常感谢碱度,奥塞伦和马科在此刻--你在帮我走出泥潭。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-09 16:13:32

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

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

您将不得不交叉编译不同版本的内核模块。如果您可以访问整个内核树,这并不太困难。制造商应该已经发布了他们的内核源(按照GPL)。如果他们没有,他们欠你消息来源。

如果您对加载内核模块的细节感兴趣,那么IBM有一个很好的“解剖”系列文章。这是可加载内核模块上的节目。跳到“模块加载详细信息”一节,了解为什么内核拒绝在没有加载力的情况下插入模块。

票数 1
EN

Stack Overflow用户

发布于 2013-01-09 19:12:34

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14241174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档