linux驱动开发insmod hello.ko失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux驱动开发insmod hello.ko失败相关的知识,希望对你有一定的参考价值。

本人最近刚接触linux驱动开发,正在看宋宝华的《linux设备驱动开发详解》,按照书上步骤编译了第一个模块:hello模块,但是执行insmod hello.ko时却出现-1 invalid module format,请问这是什么原因?该怎么解决?弄了好久没弄出来。本人用的操作系统是fedore10(2.6.27.5),下得内核是2.30.4。先给50分,给出原因和详细步骤,若帮我解决了问题,我的分可以全贡献出来,谢谢!!!

    首先进入root用户:

    $ sudo su

    密码:baohua

2. 此时按会出现Invalid module format的情况

3. 重新make,再安装就OK了

参考技术A 你好,记得当初也被这个问题困惑了,kernel module 的insmod 的时候是需要版本验证的(也可以使用方法绕过版本验证)。你可以看看他到底是怎么个版本验证法,加深你的学习。
现在看看你的问题,你下载的kerne 是2.30.4的,在make的时候kernel_dir 指定也是这个。那编译出来的module 肯定也是也是2.30.4的版本了,然后你想把这个module insmod 到的你pc linux 系统,那就肯定不行了。
1. 你可以用的linux系统内核来编译你的hello 模块。
2. 先写个makefile:
obj-m:= hello.o
3. 然后 make -C /lib/modules/$(shell uname -r )/build M=`pwd` modules
4.编译好了再insmode. 就能成功了。但是还要看的printk 的等级了,可能你还需要dmesg才能看道你的模块的操作
5. 然后你可以把上面的过程集成道一个makefile里,直接在当前目录make 就好了。
提醒下,假如你是用自己的系统作这些实验,要当心点,有的module可能会让你的系统出现oops。
所以建议你安装个虚拟机玩,或者真正要学的话,直接买个板子最好了。

最后看你下载了linux 2.30.4?是不是应该是2.6.30.4? 然后你的开发板是也是这个kernel?假如你是用板子,你现在可以把刚编好的模块,push 到板子,在insmod就好了。
参考技术B 很简单,如果你fedore10(2.6.27.5) 是,你就用(2.6.27.5的内核编译你的模块就可以了,不要再下什么2.30.4版本的内核了,不然你要先把这个内核装上你的系统让他运行起来再编译你的模块。

一般来说,你安装好系统的开发工具包后, 把makefile里面 -C 后面的目录指定到 /lib/modules/kernel-version/build 这个就可以了 build了。
你是按照 《Linux Device Drivers, 3rd Edition》 一书的那个例子来的吧?
参考技术C 他的书我也看过,你的问题应该是linux版本问题吧,记得编译驱动程序的内核和insmod时候使用的内核需要一样,
例如:我当时使用ubuntu,里边自己编译的是linux-2.6.32.4吧(记不清楚了),编译完内核之后,把内核移植到开发板,然后使用这个内核编译你的hello.c,编译生成KO文件,移动到开发板的文件系统,然后insmod就OK了,

注意需要有ARM开发板

他的书需要有一定的基础才能看懂,另外推荐韦东山的书和第一期免费视频很不错,百问网上有,韦东山的网站本回答被提问者采纳
参考技术D 可以把驱动文件贴上来看看吗?

Linux设备驱动程序加载/卸载方法 insmod和modprobe命令

linux加载/卸载驱动有两种方法。

1.modprobe

注:在使用这个命令加载模块前先使用depmod -a命令生成modules.dep文件,该文件位于/lib/modules/$(uname -r)目录下; 
modprobe命令智能地向内核中加载模块或者从内核中移除模块,可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的依赖关系,决定要载入哪些模块。若在载入过程中出错,modprobe会卸载整组的模块。

载入模块的命令: 
(1) 载入指定的模块:modprobe drv.ko 
(2) 载入全部模块:modprobe -a

卸载模块的命令:modprobe -r drv.ko

modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。

 

modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。

 选项

-a或--all:载入全部的模块;

-c或--show-conf:显示所有模块的设置信息;

-d或--debug:使用排错模式;

-l或--list:显示可用的模块;

-r或--remove:模块闲置不用时,即自动卸载模块;

-t或--type:指定模块类型;

-v或--verbose:执行时显示详细的信息;

-V或--version:显示版本信息;

-help:显示帮助。

 参数                模块名:要加载或移除的模块名称。

 实例

 查看modules的配置文件:

modprobe -c

 这里,可以查看modules的配置文件,比如模块的alias别名是什么等。会打印许多行信息,例如其中的一行会类似如下:

alias symbol:ip_conntrack_unregister_notifier ip_conntrack

 列出内核中所有已经或者未挂载的所有模块:

modprobe -l

 这里,我们能查看到我们所需要的模块,然后根据我们的需要来挂载;其实modprobe -l读取的模块列表就位于/lib/modules/`uname -r`目录中;其中uname -r是内核的版本,例如输出结果的其中一行是:

/lib/modules/2.6.18-348.6.1.el5/kernel/net/netfilter/xt_statistic.ko

 挂载vfat模块:

modprobe vfat

 这里,使用格式modprobe 模块名来挂载一个模块。挂载之后,用lsmod可以查看已经挂载的模块。模块名是不能带有后缀的,我们通过modprobe -l所看到的模块,都是带有.ko或.o后缀。

 移除已经加载的模块:

modprobe -r 模块名

 这里,移除已加载的模块,和rmmod功能相同。

2. insmod/rmmod

insmod需要指定模块的绝对路径,和modprobe不同,insmod并且不会把载入模块的依赖模块也载入进来。 
用法:insmod drv.ko

rmmod只需要模块的名字即可实现模块的卸载,同样也不会把待卸载模块的依赖模块进行卸载。 
用法:rmmod drv.ko

lsmod:显示已载入系统的模块

 

insmod(install module)

功能说明:载入模块 install loadable kernel module

语法:insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]

参数:

-f  不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
-k  将模块设置为自动卸除。
-m  输出模块的载入信息。
-o   <模块名称>  指定模块的名称,可使用模块文件的文件名。
-p  测试模块是否能正确地载入kernel。
-s  将所有信息记录在系统记录文件中。
-v  执行时显示详细的信息。
-x  不要汇出模块的外部符号。
-X  汇出模块所有的外部符号,此为预设置。

使用说明:Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。

 

insmod命令主要用于在Linux 2.4内核之前加载Linux内核模块命令。对于通过此命令加载的Linux内核模块,系统不仅不会自动解决内核模块之间的依赖关系,而且还要求将模块路径写详细。所以在Linux 2.6内核出现时,此命令已渐渐被遗忘。

 

加载RAID1阵列级别模块,如下所示:

 

[[email protected] boot]# insmod /lib/modules/2.6.

18-8.el5/kernel/drivers/md/raid1.ko  

[[email protected] boot]# lsmod |grep raid1  

raid1                  25153  0 

从以上显示结果可知,RAID1模块已加载成功。只是在使用insmod命令加载模块时,需要使用绝对路径方能加载,且加载时无法自动解决依赖关系。

扩展阅读:insmod 和modprobe的区别

insmod 与 modprobe 都是载入 kernel module,不过一般差别于 modprobe 能够处理 module 载入的相依问题。
比方你要载入 a module,但是 a module 要求系统先载入 b module 时,直接用 insmod 挂入通常都会出现错误讯息,不过 modprobe 倒是能够知道先载入 b module  后才载入 a module,如此相依性就会满足。
不过 modprobe 并不是大神,不会厉害到知道 module 之间的相依性为何,该程式是读取 /lib/modules/2.6.xx/modules.dep 档案得知相依性的。而该档案是透过 depmod 程式所建立。
















以上是关于linux驱动开发insmod hello.ko失败的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核驱动程序makefile错误:“'hello.ko'不需要建立目标'hello.mod.o'的规则”]]

linux安装内核模块问题

linux移植驱动insmod时所遇到的问题

Linux-insmod/rmmod/lsmod驱动模块相关命令(10)

你好,我的在KALI linux安装RTL8192的驱动时编译遇到点问题

Linux设备驱动程序加载/卸载方法 insmod和modprobe命令