主题 : 驱动的加载与卸载中常见问题:rmmod chdir no such file or directory 的最终解决办法 复制链接 | 浏览器收藏 | 打印
我在磨剑
级别: 新手上路
UID: 8085
精华: 1
发帖: 7
金钱: 90 两
威望: 50 点
贡献值: 10 点
综合积分: 34 分
注册时间: 2009-08-09
最后登录: 2009-12-01
楼主  发表于: 2009-10-15 19:49

 驱动的加载与卸载中常见问题:rmmod chdir no such file or directory 的最终解决办法

管理提醒: 本帖被 kasim 设置为精华(2009-10-15)
首先在开发板上建立/lib/modules/2.6.29.4-FriendlyARM这样一个文件夹,注意,板子上的/lib/modules下有一个现成的文件夹叫2.6.29-FriendlyARM,该文件夹和2.6.29.4-FriendlyARM是有区别的。2.6.29.4-FriendlyARM记录了系统的完整版本号。所有待安装的模块文件.ko需要放在这个新建的文件夹/lib/modules/2.6.29.4-FriendlyARM下面。关于新建文件夹,mini2440的用户手册上7.3.3节中的“注意”里写的路径是有错误的,请大家注意。
安装:#insmod *.ko
卸载:#rmmod *
*为模块名称,不是设备名称。
[ 此帖被33479758在2009-10-15 21:44重新编辑 ]
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5407
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11054 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-10-15 21:12
谢谢分享,这个问题终于有人给出解答了,希望友善之臂也能尽快修正这一错误
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 2807
精华: 0
发帖: 15
金钱: 90 两
威望: 27 点
贡献值: 0 点
综合积分: 30 分
注册时间: 2008-12-10
最后登录: 2015-06-20
2楼  发表于: 2009-10-25 15:52
我以为解决了,困惑了很长时间
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
贡献值: 0 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
3楼  发表于: 2009-10-28 13:42
我的还是不能卸载呀………………


[root@FriendlyARM /]# cd /lib/modules/2.6.29.4-FriendlyARM/
[root@FriendlyARM 2.6.29.4-FriendlyARM]# pwd
/lib/modules/2.6.29.4-FriendlyARM
[root@FriendlyARM 2.6.29.4-FriendlyARM]# ls    
hello.ko        modules.dep.bb
[root@FriendlyARM 2.6.29.4-FriendlyARM]# insmod hello.ko
Hello, Mini2440 module is installed !
[root@FriendlyARM 2.6.29.4-FriendlyARM]# rmmod hello    
[root@FriendlyARM 2.6.29.4-FriendlyARM]# lsmod
mini2440_hello_module 1088 0 - Live 0xbf000000
[root@FriendlyARM 2.6.29.4-FriendlyARM]#
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5407
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11054 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2009-10-28 14:26

 回 3楼(azfa) 的帖子

rmmod后面的参数是模块名字,从lsmod的输出看,你的模块名是"mini2440_hello_module"而不是"hello"
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
贡献值: 0 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
5楼  发表于: 2009-10-28 14:29
有点明白了,不能随便改名字,或者说改了也没用。还得rmmod mini2440_hello_module 来卸载。
可能跟make modules已经指定名字有关(个人猜测,linux内核还不懂)。
能不能像x86上面直接写个makefile直接编译内核(无需make modules,编译目录直接insmod 呢),请高手指教!

x86上面makefile对应如下:

ifneq ($(KERNELRELEASE),)
    obj-m :=hello.o
else
    KERNELDIR ?=/usr/src/linux-2.6.20
    PWD := $(shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
endif
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
贡献值: 0 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
6楼  发表于: 2009-10-28 14:32
谢谢4楼kasim!
就是模块名怎么和文件名不对应呢,x86上好像不是这样的,是不是还是和那个make module以及对应的makefile有关?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5407
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11054 分
注册时间: 2008-01-16
最后登录: 2014-11-22
7楼  发表于: 2009-10-28 14:55

 回 5楼(azfa) 的帖子

可以,你连Makefile也不用改,把KERNELDIR指向开发板所用内核的源代码树就可以了
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
贡献值: 0 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
8楼  发表于: 2009-10-28 18:56

 回 7楼(kasim) 的帖子

大哥,谢谢你呀,果然是这样。我一直以为一定要指定交叉工具为arm-linux-gcc ,
那个 $(MAKE)可以根据KERNELDIR目录下的主Makefile(这是我首先能想到的)或是其他什么信息决定到底用什么编译工具(gcc or arm-linux-gcc),直接指定交叉工具出错,是因为$(MAKE) -C $(KERNELDIR) M=$(PWD) modules这个不仅指定CC,应该还有LD或是其他信息,可以这么理解吗?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5407
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11054 分
注册时间: 2008-01-16
最后登录: 2014-11-22
9楼  发表于: 2009-10-29 00:10

 回 8楼(azfa) 的帖子

“$(MAKE) -C $(KERNELDIR) M=$(PWD) modules”这个命令首先读取的是$(KERNELDIR)/Makefile.交叉编译工具通常是在这个文件里指定(通过ARCH和CROSS_COMPILE)。当然,你也可以用make命令行上的参数override,比如:
$(MAKE) -C $(KERNELDIR) ARCH=arm CROSS_COMPILE=arm-linux- M=$(PWD) modules
现在之所以不需要指定是因为友善之臂提供的2.6.29的内核源代码根目录下的Makefile里已经设定了ARCH和CROSS_COMPILE的值
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."