编译hello驱动时,能够使用insmod加载进去,但rmmod时却无法卸载。

andevele 2012-02-20 04:59:42
大家都知道的hello驱动:

1 #include <linux/module.h>
2 #include <linux/init.h>
3 MODULE_LICENSE("GPL");
4 static int __init hello_init (void)
5 {
6 printk("Hello module init\n");
7 return 0;
8 }
9
10 static void __exit hello_exit (void)
11 {
12 printk("Hello module exit\n");
13 }
14
15 module_init(hello_init);
16 module_exit(hello_exit);


在经过内核编译等步骤结束后,使用sudo insmod XXX/hello.ko 时可以正常加载,通过输入dmesg命令可以看到log信息(如红色字体所示):
[ 18.765265] init: plymouth-stop pre-start process (1277) terminated with status 1
[ 20.250274] EXT4-fs (sda10): re-mounted. Opts: errors=remount-ro,commit=0
[ 203.420799] Hello module init


然后使用:sudo rmmod hello时却遇到下面的错误:

ERROR: Removing 'hello': Device or resource busy


在网上搜索后,通过重启电脑后自动卸载这个hello驱动程序,这一点我们可以理解,因为insmod是临时加载的,不是永久加载。但是我们不能总是重启电脑去解决这个问题。

有网友说在make menuconfig时把Enable loadable module support选项选中,这个我也选中了,并且保存退出了,但是经过编译后使用rmmod命令还是出现这个错误。

也有网友说,使用这个命令:
rmmod -f hello

或者:

rmmod -- force hello

但是都没用。

也有网友说是设备号什么问题,但是也没有说清楚,所以也看不懂。

请高手指点。

...全文
7156 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwk417 2013-09-26
  • 打赏
  • 举报
回复
引用 13 楼 tayue888 的回复:
[Quote=引用 9 楼 k_linux_man 的回复:] 你肯定在目标板上insmod时候可以而在rmmod的时候出现了错误,其实rmmod的时候必须存在一个目录,如果不存这个目录的话就会出现错误, /lib/modules/2.6.35/ 一般的情况是module可能不存在,或者2.6.35不存在这个目录,2.6.35是你kernek的版本号。 [/Quote] 正解,要创建这个目录的,看你的内核是什么版本,板子的文件系统,要创建相应的/lib/modules/2.6.XX insmod hello.ko加载 lsmod hello 查看下模块加载上没有,加载后有的名字会变化 rmmod hello 卸载,成功后lsmod hello查看模块是否还在
如上所说,在modules下建立一个你内核号的文件夹,如2.6.38,再把你的驱动放进来就可以了 之后insmod /lib/modules/2.6.38/hello.ko rmmod hello 就可以了,你确定一下
xiaosunshow 2013-09-24
  • 打赏
  • 举报
回复
我也遇见了,而且我的是insmod加载之后无法输入命令
Panda_熊猫 2012-10-24
  • 打赏
  • 举报
回复
strace rmmod hello
详细看看到底是到哪里出的问题。然后根据原因来解决。
Devin_la 2012-10-17
  • 打赏
  • 举报
回复
....我碰到过 我是因为 不小VI 了一个文件在那里。。。
  • 打赏
  • 举报
回复
很显然没有unregister卸载函数
mars_melo 2012-08-26
  • 打赏
  • 举报
回复
好像需要把hello.ko拷贝到一个文件夹下,才能用rmmod hello卸载,忘记是哪个目录了
czc123liyanpeng3 2012-08-22
  • 打赏
  • 举报
回复
晕。。你应该知道 make menuconfig 看看那里面的选项。。有一个 什么loading的(具体记不清了)把那个选上就可以了。。。。前一段时间遇到这个问题。。已解决。。
xgbing 2012-08-22
  • 打赏
  • 举报
回复
应该是编译的问题,你把编译方法或makefile发上来看看。
另外注意,使用的头文件要和你运行的linux版本一致。
liuxin125 2012-08-22
  • 打赏
  • 举报
回复
我也出现的类似的问题 为什么rmmod就是不会卸载呢?
飞我一年 2012-03-12
  • 打赏
  • 举报
回复
应该是Makefile里边的配置的源码目录路径不对,我的系统也是11.10的,在/usr/src/目录下有两个版本的源码。比如我的就有linux-headers-2.6.38-8-generic和linux-headers-2.6.38-13-generic,在这里应该选linux-headers-2.6.38-13-generic,也就是说DIR=/usr/src/linux-headers-2.6.38-13-generic/
changing_better 2012-03-12
  • 打赏
  • 举报
回复
但是报错貌似不是因为路径不对的原因。
黑暗中的影子 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jk110333 的回复:]

呵呵如果你在pc上运行是不应该出错的,卸载的命令是rmmod hello 不是hello.o,别弄错了!在看看你的makefile有没有写错,在网上找例子很多的
[/Quote]

难道在ARM开发板上使用rmmod hello就会出错?
tayue888 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 k_linux_man 的回复:]
你肯定在目标板上insmod时候可以而在rmmod的时候出现了错误,其实rmmod的时候必须存在一个目录,如果不存这个目录的话就会出现错误, /lib/modules/2.6.35/ 一般的情况是module可能不存在,或者2.6.35不存在这个目录,2.6.35是你kernek的版本号。
[/Quote]

正解,要创建这个目录的,看你的内核是什么版本,板子的文件系统,要创建相应的/lib/modules/2.6.XX
insmod hello.ko加载
lsmod hello 查看下模块加载上没有,加载后有的名字会变化
rmmod hello 卸载,成功后lsmod hello查看模块是否还在
炽热恒星 2012-03-01
  • 打赏
  • 举报
回复
卸载函数注册时的名字有没有写错了。我出过一次这个问题。
siasjack 2012-02-28
  • 打赏
  • 举报
回复
呵呵如果你在pc上运行是不应该出错的,卸载的命令是rmmod hello 不是hello.o,别弄错了!在看看你的makefile有没有写错,在网上找例子很多的
karry_vcent 2012-02-26
  • 打赏
  • 举报
回复
你肯定在目标板上insmod时候可以而在rmmod的时候出现了错误,其实rmmod的时候必须存在一个目录,如果不存这个目录的话就会出现错误, /lib/modules/2.6.35/ 一般的情况是module可能不存在,或者2.6.35不存在这个目录,2.6.35是你kernek的版本号。
liujwcool1 2012-02-25
  • 打赏
  • 举报
回复
lsmod 看看hello.ko有没有被used
aaron_love 2012-02-24
  • 打赏
  • 举报
回复
这个有点奇怪,我的helloworld 完全没有问题啊。
caodian 2012-02-23
  • 打赏
  • 举报
回复
是不是 hello_exit 没返回的原因啊里面加return 0 试试,
niclast_rui 2012-02-23
  • 打赏
  • 举报
回复
楼主的hello里面有卸载函数么?是PC机的LINUX还是嵌入式?嵌入式的话在订制操作系统的时候有一个是是否能强制卸载模块的选项的。
加载更多回复(3)
Linux设备驱动程序学习(0)-Hello, world!模块 Linux设备驱动程序学习(0) -Hello, world!模块 一个学习Linux设备驱动程序都会碰到的第一个例程: #include #include MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, Tekkaman Ninja !\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye, Tekkaman Ninja !\n Love Linux !Love ARM ! Love KeKe !\n"); } module_init(hello_init); module_exit(hello_exit); 我将其复制到我的工作目录,并编写了一个简单的Makefile文件: KERNELDIR = /home/tekkaman/working/SBC2440/linux-2.6.22.2 # The current directory is passed to sub-makes as argument PWD := $(shell pwd) INSTALLDIR = /home/tekkaman/working/rootfs/lib/modules CROSS_COMPILE =/home/tekkaman/working/crosstool-gcc410-k26222/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu- CC = $(CROSS_COMPILE)gcc obj-m := hello.o modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_install: cp hello.ko $(INSTALLDIR) clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions .PHONY: modules modules_install clean 说实话,以上是我参考了《Linux设备驱动程序(第3版)》的Makefile源码修改得来的。我对Makefile不是很了解,是该好好学习学习了! 然后就是make modules 、 make modules_install 。 [root@Tekkaman-Ninja Helloworld]# make modules make -C /home/tekkaman/working/SBC2440/linux-2.6.22.2 M=/home/tekkaman/working/Linuxdriver/Helloworld modules make[1]: Entering directory `/home/tekkaman/working/SBC2440/linux-2.6.22.2' CC [M] /home/tekkaman/working/Linuxdriver/Helloworld/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/tekkaman/working/Linuxdriver/Helloworld/hello.mod.o LD [M] /home/tekkaman/working/Linuxdriver/Helloworld/hello.ko make[1]: Leaving directory `/home/tekkaman/working/SBC2440/linux-2.6.22.2' [root@Tekkaman-Ninja Helloworld]# make modules_install cp hello.ko /home/tekkaman/working/rootfs/lib/modules [root@Tekkaman-Ninja Helloworld]# 在我的开发板上的操作: [Tekkaman2440@SBC2440V4]#cd /lib/modules/ [Tekkaman2440@SBC2440V4]#ls cs89x0.ko hello.

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧