相当棒的文章
转自:http://apps.hi.baidu.com/share/detail/14755964
我自己的解决方法:
1,根据modinfo hello.ko命令查看vermagic的值
2,根据uname -r查看内核版本
3,对比上边两步的值是否相同
若相同,我就不知道了
若不同,采用make -C /lib/modules/此处为你内核版本号对应的文件夾/build M=你模块源码的路徑 modules
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"
分享到:
相关推荐
### insmod命令与模块...综上所述,当遇到`insmod:error inserting 'hello.ko': -1 Invalid module format`这类错误时,可以通过以上步骤逐一排查解决问题。希望本篇内容能帮助您成功解决模块加载过程中遇到的问题。
某品牌路由器刷机不死启动必备工具,懒得四处找了,自已备用,newifi d2,简单3步: 1,打开SSH,http://192.168.99.1/newifi/ifiwen_hss.html 2,下载newifi-d2-jail-break.ko...3,insmod newifi-d2-jail-break.ko
安装Ubuntu16.04.04版本,联想官网没有对应的驱动,这个驱动是用源码编译形成的,对应的Ubuntu内核版本是4.4.0-116,安装方法是在安装Ubuntu选择硬盘时,切换到命令模式,把驱动拷贝进去,运行insmod megaraid_...
/bin/sh: 1: arm-linux-gnueabi-arm-linux-gnueabi-gcc: not found make:进入目录'/home/rootroot/wyb/r58_evb_sc5806/lichee/linux-3.4/modules/eurasia_km/eurasiacon/build/linux2/sunxi_android' CC [M] /home/...
4. **加载模块**:编译成功后,使用`sudo insmod vmmon.ko`命令将模块加载到内核中。如果出现错误,检查是否有缺失的依赖或内核版本不兼容的问题。 5. **测试**:启动VMware软件,看看是否能够正常运行虚拟机。如果...
在深入探讨如何编译第一个Linux内核模块hello.ko.txt之前,我们首先应当明确几个关键概念:Linux内核模块、Makefile以及相关的编程语言和工具。Linux内核模块是能够被动态加载到运行中的内核的独立代码块,用于扩展...
sudo insmod hello.ko sudo rmmod hello.ko ``` 加载模块后,会在系统日志中看到`Hello china init`的消息,卸载时则会显示`Hello china exit`。这标志着我们已经成功创建并运行了一个基本的Linux内核模块。 总结...
成功构建后,可以通过 `insmod hello.ko` 加载模块,用 `rmmod hello.ko` 卸载模块,并用 `dmesg` 查看模块加载的日志信息。 通过比较和学习这两种不同的 `Makefile`,我们可以深入理解构建过程中的灵活性和自定义...
1. **CH341驱动**:CH341是一种常见的USB到UART桥接芯片,用于建立USB接口与串行通信之间的连接。驱动程序`ch341.ko`允许Linux系统识别并正确操作基于CH341的USB-TTL适配器,从而实现数据传输。 2. **PL2303驱动**...
要测试这个驱动,可以使用`insmod hello.ko`加载模块,然后在用户空间编写应用程序或者使用`cat /proc/devices`查看新注册的设备,通过`mknod`创建设备节点,并用`cat`或`echo`等工具进行交互。 通过这个简单的...
reg [1:0] sel; shift_reg u1 ( .clock (clock), .load (load), .reset (reset), .shiftreg (shiftreg), .data (data), .sel (sel)); initial begin clock = 0; forever #50 clock = ~clock; end ...
错误1: KCONFIG_AUTOCONFIG=/home/wwt/linux_r16/lichee/out/sun8iw5p1/linux/common/buildroot/build/buildroot-config/auto.conf KCONFIG_AUTOHEADER=/home/wwt/linux_r16/lichee/out/sun8iw5p1/linux/common/...
用法: sudo insmod secbulk.ko 2.2 自动化 在编译成功后,完成下列步骤方面以后使用: 2.2.1 将dnw放到系统路径: sudo cp dnw /usr/sbin/ 2.2.2 将secbulk.ko驱动设为自动加载: 先在住目录建立mydriver...
编译后的模块文件(通常是`.ko`格式)可以通过前述的`insmod`或`modprobe`命令加载到内核中。加载过程中,内核会解析模块的元数据,如许可信息和文档字符串,这些信息对于模块的管理和安全性检查至关重要。 ### ...
使用 insmod 命令加载 hello.ko 模块: `insmod hello.ko` 使用 dmesg 命令查看打印信息: `dmesg` 然后,使用 rmmod 命令卸载 hello.ko 模块: `rmmod hello.ko` 再次使用 dmesg 命令查看打印信息: `dmesg`...
- insmod libcomposite.ko - insmod g_ether.ko - insmod usb_f_ecm.ko - insmod usb_f_ecm_subset.ko - insmod usb_f_rndis.ko 加载完毕后,设备会识别到一个新的usb0虚拟网卡,这表示设备端的网络连接已经准备好。...
# insmod mtd-rw.ko i_want_a_brick=1 # dmesg | grep mtd-rw [52997.620000] mtd-rw: mtd0: setting writeable flag [52997.630000] mtd-rw: mtd1: setting writeable flag [52997.640000] mtd-rw: mtd3: setting ...
1. **解压文件**:首先,使用`unrar`或类似工具解压缩文件,例如`unrar x iwlwifi-Qu-48.13675109.0.rar`。 2. **获取root权限**:由于涉及到系统文件的修改,你需要以管理员身份操作,可以使用`sudo -i`或`su`命令...
3. insmod /lib/modules/<kernel-version/kernel/drivers/usb/serial/usbserial.ko 4. insmod cp210x.ko RedHat: 1. yum update kernel* //need to update the kernel first otherwise your header won't match 2. ...
1. **insmod**:用于将内核模块插入到运行中的内核中。这允许在系统运行时添加新的硬件支持或其他功能。 2. **rmmod**:此命令用于从内核中移除已经加载的模块。当某个模块不再需要或者出现问题时,可以使用rmmod...