Linux问题:触摸屏驱动运行出现insmod: cannot insert `ucb1x00-ts.ko': File exists (-1): File exists
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux问题:触摸屏驱动运行出现insmod: cannot insert `ucb1x00-ts.ko': File exists (-1): File exists相关的知识,希望对你有一定的参考价值。
说明你已经加载过ucb1x00-ts.ko'啦 不能重复加载的先卸载ucb1x00-ts.ko' 用rmmod追问
我是第一次加载啊····
追答那是你的内核本身带有这个模块吧,或者改改名试试 不知道行不行
追问改名后,重新编译会出错!
追答哎 具体我也没办法啦,
先看看你自己编写的驱动的主设备号,在查一下系统已经使用的主设备号,我以前遇到的类似问题是设备号重复啦,最好自动分配主设备号,如果还不行那我也不知道啦
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:显示已载入系统的模块
功能说明:载入模块 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: cannot insert `ucb1x00-ts.ko': File exists (-1): File exists的主要内容,如果未能解决你的问题,请参考以下文章
Linux-insmod/rmmod/lsmod驱动模块相关命令(10)