Linux kernel 使用Android系统为特殊ARM设备构建linux内核模块

Linux kernel 使用Android系统为特殊ARM设备构建linux内核模块,linux-kernel,linux-device-driver,embedded-linux,Linux Kernel,Linux Device Driver,Embedded Linux,我有一个android设备,其linux内核如下 shell@android:/ # uname -a uname -a Linux localhost 3.0.50-g72b01fe #1 SMP PREEMPT Tue Nov 26 14:22:32 CST 2013 armv 7l GNU/Linux 我想为这个设备建立一个uvc驱动模块。因此,在linux内核3.0.101上构建模块。我没有找到3.0.50版本的内核,所以改用3.0.101 $ export ARCH=arm $ ex

我有一个android设备,其linux内核如下

shell@android:/ # uname -a
uname -a
Linux localhost 3.0.50-g72b01fe #1 SMP PREEMPT Tue Nov 26 14:22:32 CST 2013 armv
7l GNU/Linux
我想为这个设备建立一个uvc驱动模块。因此,在linux内核3.0.101上构建模块。我没有找到3.0.50版本的内核,所以改用3.0.101

$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabi-
$ build modules
但是我想使用insmod在设备中安装模块。我遇到了一个错误

$ insmod /tmp/videobuf2-core.ko
init_module 'videobuf2-core.ko' failed (Exec format error)
因此,我使用modinfo、file和armlinux gnueabi readelf命令来检查videobuf2_core.ko

$ modinfo videobuf2-core.ko
filename:       videobuf2-core.ko
license:        GPL
author:         Pawel Osciak <pawel@osciak.com>, Marek Szyprowski
description:    Driver helper framework for Video for Linux 2
srcversion:     30ECE251825184452C89B09
depends:        
vermagic:       3.0.101  mod_unload modversions ARMv5 
parm:           debug:int 

$ file videobuf2-core.ko
videobuf2-core.ko: ELF 32-bit LSB relocatable, ARM, version 1, BuildID[sha1]=0x06240ff3b9f45700086c387fb2b411848ad65fcd, not stripped

$ arm-linux-gnueabi-readelf -a videobuf2-core.ko | head
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            ARM
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           ARM
  Version:                           0x1
通过两个文件的比较。我发现有一些不同

vermagic:

    videobuf2-core.ko which is built by me
        3.0.101  mod_unload modversions ARMv5 

    dhd.ko which is normal module in the device
        3.0.50-g72b01fe SMP preempt mod_unload modversions ARMv7 

ELF info

    videobuf2-core.ko which is built by me
        ELF 32-bit LSB relocatable, ARM, version 1, BuildID[sha1]=0x06240ff3b9f45700086c387fb2b411848ad65fcd, not stripped

    dhd.ko which is normal module in the device
        ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), BuildID[sha1]=0x2db993479965068d38e108b675a8315aa0965f5f, not stripped

OS/ABI

    videobuf2-core.ko which is built by me
        ARM

    dhd.ko which is normal module in the device
        UNIX - System V

如何配置构建linux内核模块,使我的videobuf2-core.ko与普通模块dhd.ko相似?我可以使用insmod命令在设备中安装我的模块。

在这种情况下,最简单的方法可能是使用3.0.101 linux版本运行android。你确定你有适合这种ARM架构(armv5和armv7)的工具链(gcc)吗?

我不确定,我是嵌入式linux的新手。我认为我的工具链支持armv5和armv7。但我不知道如何在构建linux内核时配置armv7。也许在某个地方,我需要设置“-march=armv7-a-mfloat abi=softfp”的标志。你能告诉我如何配置吗?我想你的设备需要有合适的Android内核。我一直在git.kernel.org的3.0.50内核中寻找git commit 72b01fe,但没有找到它——这意味着(我猜)Android有自己的内核git树。不幸的是,我不熟悉Android,但我认为如果你有Andriod内核,并且为你的系统选择合适的平台,你不必设置-march这样的标志,因为Android内核已经有了它。你真的应该从与设备上运行的版本对应的内核源开始,设备供应商有义务提供给你们的东西。我不明白答案!我的android linux内核是3.0.50,我的linux是3.13。我如何用内核3.0.50编译我的模块?!
vermagic:

    videobuf2-core.ko which is built by me
        3.0.101  mod_unload modversions ARMv5 

    dhd.ko which is normal module in the device
        3.0.50-g72b01fe SMP preempt mod_unload modversions ARMv7 

ELF info

    videobuf2-core.ko which is built by me
        ELF 32-bit LSB relocatable, ARM, version 1, BuildID[sha1]=0x06240ff3b9f45700086c387fb2b411848ad65fcd, not stripped

    dhd.ko which is normal module in the device
        ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), BuildID[sha1]=0x2db993479965068d38e108b675a8315aa0965f5f, not stripped

OS/ABI

    videobuf2-core.ko which is built by me
        ARM

    dhd.ko which is normal module in the device
        UNIX - System V