分页: 1 / 1

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

发表于 : 2012-02-20 18:17
zlfllq
大家都知道的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

但是都没用。

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

请高手指点。

注:我的系统是11.10

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

发表于 : 2012-02-21 11:53
Jr.z
我想问问lz你的内核是发行版自带的,还是自己编译的。
去看看系统的/proc/config.gz
我记得Enable loadable module support选项下面还有关于动态装载和动态卸载的选项的

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

发表于 : 2013-01-02 18:32
roybein
查看一下你的gcc版本是不是与内核编译的版本一致,我在12.04上修改过/usr/bin/gcc链接到gcc-4.4, 编译的module就无法rmmod, 但是改回 gcc-4.6 就可以了。
12.04默认的应该是gcc-4.6