`
koliy
  • 浏览: 148666 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

android-insmod驱动模块出错问题解决方法

 
阅读更多

转载:http://hi.baidu.com/bamboolsu/blog/item/3b8a8608f8e2f98fd0581b79.html
---------------------------------------------------------------------

insmod: error inserting 'hello.ko': -1 Invalid module




1, make xconfig
General setup---->>>local version -append to kernel release:       在这儿添加下面内容
-170.2.117.fc10.i686

or modify ./.config file:
#
# General setup
#
CONFIG_EXPERIMENTAL=y
CONFIG_LOCK_KERNEL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_LOCALVERSION="-170.2.117.fc10.i686"

.config配置文件
在内核树的根目录中,有一个.config文件,它记录了内核的配置选项,可直接对它进行修改,再运行(若.config不存在,对内核进行配置后会生成它,这种情况下当然不能开始就运行oldconfig). 实际上, 如果你手头有合适的 .config 文件, 可以运行 make oldconfig  直接按 .config 的内容来配置


2, save config

3, make kernel
then the ./include/linux/utsrelease.h  will change from linux-2.6.27.41 to linux-2.6.27.41-170.2.117.fc10.i686



[leo@leo linux-2.6.27.41-170.2.117.fc10.i686]$ findcode 2.6.27.41
./include/linux/autoconf.h: * Linux kernel version: 2.6.27.41
./include/linux/utsrelease.h:#define UTS_RELEASE "2.6.27.41"
[leo@leo linux-2.6.27.41-170.2.117.fc10.i686]$ vi ./include/linux/utsrelease.h


[leo@leo test]$ sudo cat /var/log/messages | tail
Jul  2 17:07:32 leo dhcpd: DHCPACK on 192.168.1.93 to 00:02:9b:48:7a:04 via eth1
Jul  2 17:09:46 leo kernel: hello: version magic '2.6.27.41 SMP mod_unload 686 4KSTACKS ' should be '2.6.27.41-170.2.117.fc10.i686 SMP mod_unload 686 4KSTACKS '





  在使用命令ismod helloworld.ko 加载编译成功的模块helloworld.ko时出现错误  insmod: error inserting 'helloworld.ko': -1 Invalid module format
一般出错信息被记录在文件/var/log/messages中
[root@hailiang linux-2.6.15.5]# cat /var/log/messages |tail

  May  8 16:41:45 hailiang kernel: helloworld: version magic '2.6.27.5-117.fc10.i686 SMP mod_unload modversions 686 4KSTACKS ' should be '2.6.27.5-117.fc10.i686 SMP mod_unload 686 4KSTACKS '

通过命令看一下模块的相关信息

[root@hailiang tmp]# modinfo helloworld.ko
filename:       helloworld.ko
alias:          a simplest module
description:    A simple helloworld module
author:         zhanghailiang
depends:       
vermagic:       2.6.27.5-117.fc10.i686 SMP mod_unload modversions 686 4KSTACKS  

内核无法加载模块的原因是因为记载版本号的字符串和当前正在运行的内核模块的不一样,这个版本印戳作为一个静态的字符串存在于内核模块中,叫vermagic,可以从编译模块中间生成的文件helloworld.moc.h中

#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>

MODULE_INFO(vermagic, VERMAGIC_STRING);找到这个符号,

打开文件/usr/src/kernels/2.6.27.5-117.fc10.i686/include/linux/vermagic.h (注意在fedroa 10 中源码树是在/usr/src/下)

#include <linux/utsrelease.h>
#include <linux/module.h>

/* Simply sanity version stamp for modules. */
#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
。。。。。。。。。。。。。。。。。。。
#ifdef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MO

DVERSIONS "modversions "
#else
#define MODULE_VERMAGIC_MODVERSIONS ""
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
#endif

#define VERMAGIC_STRING                                                 \
UTS_RELEASE " "                                                 \
MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT                     \
MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS       \
MODULE_ARCH_VERMAGIC


从这里看出vermagic中多出来的字符modversions是由于编译内核时选上了 “”选项的原因,(其实这是因为在编译helloworld模块前,自己曾试图重新编译内核所致:cd /usr/src/kernel..

[root@hailiang 2.6.27.5-117.fc10.i686]# make menuconfig
scripts/kconfig/mconf arch/x86/Kconfig
#
# configuration written to .config
#



*** End of Linux kernel configuration.
*** Execute 'make' to build the kernel or try 'make help'.

[root@hailiang 2.6.27.5-117.fc10.i686]# make
scripts/kconfig/conf -s arch/x86/Kconfig
CHK     include/linux/version.h
CHK     include/linux/utsrelease.h
make[1]: *** No rule to make target `missing-syscalls'.  Stop.
make: *** [prepare0] Error 2

)见下图





然后再重新编译helloworld.ko模块,然后再加载helloworld 成功。

  一点别的:在网上对这个问题有另一个解决方法就是modprobe --force-vermagic helloworld强制加载内核,在这里我试了一下问题还是原来invalid module format

注意:(1)modprobe   模块名(不要带后缀.ko)   注:挂载一个模块

(2)在这里直接modprobe ./helloworld 错误
FATAL: Module helloworld not found.
这是因为

使用man modprobe看

DESCRIPTION

      modprobe intelligently adds or removes a module from the Linux kernel: note that  for  conve-
nience, there is no difference between _ and - in module names.  modprobe looks in the module
directory /lib/modules/‘uname -r‘ for all  the  modules  and  other  files,  except  for  the
optional  /etc/modprobe.conf  configuration  file  and  /etc/modprobe.d  directory  (see mod-
probe.conf(5)). modprobe will also use module options specified on the kernel command line i
modprobe会自动在/lib/modules/'uname -r'下寻找模块加载,将helloworld.ko拷到/lib/modules 下然后再执命令 modprobe helloworld 发现还是找不到,从man modprobe

  modprobe  expects  an  up-to-date  modules.dep  file, as generated by depmod (see depmod(8))

看出还需要依赖命令:depmod生成的module.dep 使用这个命令后 在modprobe helloworld 成功





findcode sell program.


#!/bin/sh                      

if [ "$1" = "" ]; then
echo "Syntax:"   
echo " fcode [-q] [-i] [-b] [-t] [-nc] [-p path] code"
echo " -q: only print file names"                    
echo " -i: case insensitive"                         
echo " -b: look also in build dirs: '*-linux-gnu/...'"
echo " -t: don't look in '3pp/...'"
echo " -nc: no color grep (is useful when piping output)."

exit
fi

path=.

grep_cmd="/bin/grep --color=always"

while (( "$#" )); do
if [ "$1" == "-q" ] ; then
quiet="-l"
fi
if [ "$1" == "-i" ] ; then
ignore_case="-i"
fi
if [ "$1" == "-b" ] ; then
### This will destroy the pruning of *-linux-gnu and
### therefore those directories will be checked:
check_build_dirs="true"
fi
if [ "$1" == "-t" ] ; then
skip_3pp="-name 3pp -prune -or"
fi
if [ "$1" == "-p" ] ; then
shift;
path="$1"
fi
if [ "$1" == "-nc" ]; then
grep_cmd="/bin/grep"
fi

code=$1
shift;
done

find $path -name "dist" -prune -or -name ".svn" -prune -or \
-name "*-linux-gnu$check_build_dirs" -prune -or $skip_3pp \
-iname "*.c" -or -iname "*.h" -or -iname "*.cpp" -or \
-name "Makefile*" -or -name "Imakefile" -or -name "dist_*" -or \
-name "dist-*" -or -name "*.idl" -or -name "*.htm*" -or \
-name "*.xml" -or -name "*.sh" -or -name "*.perl" -or \
-name "*.pl" -or -name "configure" -or -name "*.in" -or \
-name "*.patch" -or -name "PATCHES" | sed -e "s/ /\\\ /g" | \
xargs $grep_cmd $quiet $ignore_case "$code"







分享到:
评论

相关推荐

    wifi-usb使用报告

    本文档旨在指导用户编译和使用 wifi-usb 驱动模块在 Linux 平台下,特别是在 ARM 架构的开发板上。下面将详细介绍编译和使用 wifi-usb 驱动模块的步骤。 一、编译Linux内核 首先,需要编译 Linux 内核,以便在 ARM...

    insmod解决.txt )

    ### insmod命令与模块...综上所述,当遇到`insmod:error inserting 'hello.ko': -1 Invalid module format`这类错误时,可以通过以上步骤逐一排查解决问题。希望本篇内容能帮助您成功解决模块加载过程中遇到的问题。

    Petalinux如何加载AXI-DMA驱动.docx

    在运行的操作系统中,你可以使用`insmod`或`modprobe`命令加载AXI-DMA驱动。之后,你可以编写应用程序来利用驱动进行数据传输。 以上步骤详细介绍了在PetaLinux中加载AXI-DMA驱动的过程,包括项目初始化、硬件描述...

    Android-TQ2440-driver.rar_andriod driver_android_android driver_

    - **编译构建**:将驱动代码编译成内核模块,然后将其整合到Android系统的内核中。 - **驱动加载**:在设备启动时,驱动会被自动加载,或者通过insmod命令手动加载。 - **测试验证**:通过设备的硬件功能测试,确保...

    Android8.1-usb摄像头调试.pdf

    在 Android 8.1 系统中,需要打开 UVC 模块驱动,以便支持 USB 摄像头。在 kernel 配置中,需要选择“Device Drivers” &gt; “Multimedia support” &gt; “Media USB Adapters” &gt; “USB-Video-Class (UVC)”和“UVC ...

    MTK-WIFI驱动-源码分析.doc

    驱动安装的第一步是加载 WIFI 驱动模块 `mt-wifi.ko`,使用 `insmod` 命令加载该模块。随后,使用 `ifconfig ra0 up` 命令启动 WIFI 设备。 在驱动源码中,`rt2880_module_init` 函数是驱动的入口点,它负责初始化 ...

    Android驱动开发与移植实战详解_android驱动_android驱动_android_

    在Android系统中,驱动程序是操作系统与硬件之间的重要桥梁,它们负责管理硬件资源,提供高效、稳定的服务。本文将深入探讨Android驱动开发与移植的实战细节,帮助开发者理解和掌握这一关键技能。 一、Android驱动...

    Android内核led灯驱动程序

    在Android系统中,LED灯驱动程序是内核层面的一个重要组成部分,它负责与硬件交互,控制设备上的LED灯的亮灭状态。LED灯驱动通常基于Linux内核的设备驱动模型来编写,允许操作系统通过特定的接口与硬件进行通信。在...

    gt9xx_driver_android-master.zip

    总结,"gt9xx_driver_android-master.zip" 文件涉及的知识点包括Android系统的Linux驱动开发、GT9xx系列触摸屏控制器的工作原理、Android的硬件抽象层、驱动编译与加载、测试调试方法,以及版本控制和CI/CD流程。...

    移远EC20的4G模块驱动程序源码

    - 在Linux系统中,驱动通常作为内核模块实现,可以通过insmod或modprobe加载。 - 驱动源码需遵循Linux内核编码规范,使用内核API与内核其他部分交互。 7. **Android平台集成** - Android系统基于Linux内核,但其...

    rtl8192eu-linux驱动

    该驱动程序使得Linux用户能够顺利连接到WiFi网络,解决了在某些Linux发行版中无法识别或无法正常工作的问题。 Realtek RTL8192EU是一款常见的USB无线网卡芯片,它支持802.11b/g/n无线标准,提供最高150Mbps的无线...

    Android驱动移植与开发

    在Android系统中,驱动程序是操作系统与硬件之间的重要桥梁,它们负责管理硬件资源,提供硬件功能,使得上层应用程序能够高效、稳定地运行。本文将深入探讨Android驱动移植与开发的相关知识点,主要针对Android 2.x...

    [嵌入式开发板]iTOP-4412以模块的方式编译驱动

    ### 嵌入式开发板iTOP-4412以模块方式编译驱动的知识点详解 #### 一、背景介绍 嵌入式系统广泛应用于各种领域,如工业自动化、消费电子、通信设备等。在嵌入式系统开发中,内核驱动程序是连接硬件与操作系统的关键...

    操作系统课程实验--内核模块创建与链表构建Project-1.pdf

    接下来,可以使用`insmod`命令将模块加载到内核中,使用`rmmod`命令卸载模块。加载模块后,通过`dmesg`查看内核日志确认模块是否成功加载和卸载。 项目的一部分要求创建一个包含四个`struct Birthday`元素的链表。`...

    华为4g模块 pcie me909s-821 linux驱动

    9. **故障排查**:如果在安装过程中遇到问题,查阅华为提供的驱动集成指导文档,或者参考社区论坛和官方文档,寻找解决方案。 总之,安装华为4G模块PCIe ME909S-821的Linux驱动是一个涉及硬件识别、驱动编译、内核...

    RNDIS共享windows网络连接.pdf

    - Windows 7由于自带的RNDIS驱动存在的问题,可能无法实现网络连接共享,且安装驱动时可能会出现系统警告或崩溃。 - 在Windows 10设备中,有时系统可能安装错误的驱动程序,从而导致无法实现网络连接共享。在这种...

    Intel I219-LM网卡驱动源码以及说明文件.zip

    “readme.txt”文件通常是提供给用户的指南,包含编译、安装、使用驱动的详细步骤,以及可能遇到的问题和解决方法。它对于不熟悉驱动程序开发的用户来说至关重要,因为它提供了操作流程和注意事项,帮助用户顺利地将...

    ok6410 Android开发板ndk开发生成测试led驱动模块

    在Android系统中,开发硬件驱动通常涉及到Linux内核层面的操作,而LED驱动模块是设备驱动的一种,用于控制LED(Light Emitting Diode)的工作状态。本文将深入探讨如何在ok6410 Android开发板上添加LED驱动模块,并...

    SR650 手动加载430-16iHBA驱动安装Centos6.5Guide.docx

    ### Lenovo SR650 手动加载430-16iHBA驱动安装CentOS 6.5 指南 #### 环境配置 ...在实际操作过程中, 用户需要注意每一个步骤的细节, 特别是在加载驱动和处理旧驱动冲突时, 需要特别小心, 以避免系统出现问题。

Global site tag (gtag.js) - Google Analytics