android-已编译的LKM的互换性

android-已编译的LKM的互换性,第1张

概述是否可以使用在3.0.31-gd5a18e0SMP抢占mod_unloadARMv7版本(Android股票内核)版本的内核中为3.0.8mod_unloadARMv5(由我自己制作的内核)编译的可加载内核模块?模块本身几乎不包含任何内容//Defining__KERNEL__andMODULEallowsustoaccesskernel-levelcodenotusual

是否可以使用在3.0.31-gd5a18e0 SMP抢占mod_unload ARMv7版本(Android股票内核)版本的内核中为3.0.8 mod_unload ARMv5(由我自己制作的内核)编译的可加载内核模块?

模块本身几乎不包含任何内容

// 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 macrosMODulE_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] Unable to handle kernel NulL pointer dereference at
virtual address 00000061 <1>[ 328.025695] pgd = c1be8000 <1>[
328.025848] [00000061] *pgd=00000000 <0>[ 328.026184] Internal error: Oops: 5 [#1] PREEMPT SMP <4>[ 328.026519] Modules linked in:
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.0ARCH=arm

用于构建内核和现在构建模块.但是应该使用它自己的工厂内核来插入其上的系统.

我尝试构建一个可以在多个androID手机(arm,armv5,armv7等)上使用的内核模块,但是我想对所有模块都使用1(如果可以任何方式).

(编辑)

结论#1

>应该不可能为所有ARM设备编译一个版本:

为ARMv5的内核3.0.8编译LKM并在内核3.0.39 ARMv7上使用
>可能(目前尚未试用!)可以在最低级别(ARMv5)上进行编译,并在更高级别(ARMv6,ARMv7)上使用

为ARMv5的内核3.0.8编译LKM并在内核3.0.8 ARMv7上使用它
>可以互换内核版本(也许如果是简单的LKM)

为ARMv5的内核3.0.8编译LKM并在内核3.0.39 ARMv5上使用

目前有待解决的问题:

1.)

我尝试(使用common-kernel 3.0.8和omap-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”,则会自动编辑文件get,并删除我的v7-config.
几个月前,我记得这没问题,我只添加了两行就可以了.

这是内核源代码还是二手工具链?

2.)

例如,鉴于LKM的建设,是“ omap内核”还是“公共内核”?只是另一个内核版本(例如common-kernel现在有3.0.53和omap-kernel 3.0.39)?我想我可以“忽略”特定的变体,并使用通用内核进行LKM编译?

非常感谢碱度,auselen&现在的Marko-您正在帮助我摆脱困境.

解决方法:

不,这是不可能的. linux内核为architecture-specific,ARMv5模块与ARMv7不兼容.需要不同的头文件,这些头文件将具有不同的指令集,寄存器映射或许多重要的变体.

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

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

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

总结

以上是内存溢出为你收集整理的android-已编译的LKM的互换性全部内容,希望文章能够帮你解决android-已编译的LKM的互换性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1211043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存