Chinaunix首页 | 论坛 | 博客
  • 博客访问: 346775
  • 博文数量: 88
  • 博客积分: 907
  • 博客等级: 准尉
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 13:27
文章分类

全部博文(88)

文章存档

2017年(1)

2014年(3)

2013年(29)

2012年(21)

2011年(26)

2010年(8)

分类: LINUX

2010-06-12 12:58:42

今天是星期六,天气雨

今天的雨从昨晚到现在就没停过,听着外边的声音感觉雨很大。今天没什么特别的,和往常一样我坐在电脑前开始了我的学习,今天我学LDD3第四章,其实这章我已经看过了,但是就是没什么感觉,所以想去做一下实验。好好去感受一下实验的效果。

前边的测试都是正常的,但是当我在卸载模块时,却出现了错误(rmmod: module 'scull_debug' not found)。如果这个错误被刚开始学的人看见,他可能会觉得模块没有被卸载掉,其实他是卸载掉了的。这个错误在我刚开始学习的时候就出现了的,但是却没有像去解决,今天在做实验时,我看着很不爽,就想着把它解决了。但是怎么找也不知道去解决。发现不是kernel,那是busubox的问题吗?我就去查了一会资料。在google上查找,一篇文章闯进了我的眼睛,我打开看了看,原来他也遇见和我一样的问题,于是我好好的拜读了他的文章,发现确实BUSYBOX的问题,是这个rmmod命令的问题,只是自己在重新做一个就好。我现在把他复制在这里来,给自己看看,如果谁在遇见也可以看看,嘻嘻!


下边就是我复制的东东!

http://blog.chinaunix.net/u1/38994/showart_2034575.html


开发板上rmmod卸载模块必须创建/lib/modules/2.6.30.4这样一个空目录


必须创建/lib/modules/2.6.30.4这样一个空目录,否则不能卸载ko模块.
# rmmod nls_cp936
rmmod: chdir(/lib/modules): No such file or directory
但是这样倒是可以卸载nls_cp936,不过会一直有这样一个提示:
rmmod: module 'nls_cp936' not found
后来知道,原来这是编译kernel时使用make modules_install生成的一个目录,
------------------------------------------
为arm平台的内核安装/lib/modules/路径
luther@gliethttp:~$ mkdir -p gliethttp_rootfs/lib/modules/2.6.21
luther@gliethttp:~$ /sbin/depmod -ae -F System.map -b gliethttp_rootfs -r 2.6.21
luther@gliethttp:~$ tree gliethttp_rootfs/
gliethttp_rootfs/
`-- lib
`-- modules
`-- 2.6.21
|-- modules.alias
|-- modules.alias.bin
|-- modules.ccwmap
|-- modules.dep
|-- modules.dep.bin
|-- modules.ieee1394map
|-- modules.inputmap
|-- modules.isapnpmap
|-- modules.ofmap
|-- modules.pcimap
|-- modules.seriomap
|-- modules.symbols
|-- modules.symbols.bin
`-- modules.usbmap

3 directories, 14 files
------------------------------------------
luther@gliethttp:/vobs/works/linux-2.6.30.4$ make modules_install INSTALL_MOD_PATH=/vobs/gliethttp
luther@gliethttp:/vobs/works/linux-2.6.30.4$ tree /vobs/gliethttp/
/vobs/gliethttp/
`-- lib
`-- modules
`-- 2.6.30.4
|-- build -> /vobs/works/linux-2.6.30.4
|-- kernel
| |-- drivers
| | `-- scsi
| | `-- scsi_wait_scan.ko
| `-- fs
| `-- nls
| `-- nls_cp936.ko
|-- modules.alias
|-- modules.ccwmap
|-- modules.dep
|-- modules.ieee1394map
|-- modules.inputmap
|-- modules.isapnpmap
|-- modules.ofmap
|-- modules.order
|-- modules.pcimap
|-- modules.seriomap
|-- modules.symbols
|-- modules.usbmap
`-- source -> /vobs/works/linux-2.6.30.4

10 directories, 14 files
然后将上面生成的modules目录拷贝到开发板的/lib下即可.
也可以直接释放到initramfs中
luther@gliethttp:/vobs/works/linux-2.6.30.4$ make modules_install INSTALL_MOD_PATH=/vobs/initramfs
但是kernel目录下的包含了所有.ko,这是我所不期望的,因为我把.ko放在一个我们独立的存储区,
但是将kernel目录删除之后,就又会提示:rmmod: module 'nls_cp936' not found,当然模块是已经卸载了,但有这种提示总让人感觉怪怪的,
所以上面的拷贝就没有了意义,
luther@gliethttp:/vobs/initramfs/lib/modules/2.6.30.4$ rm -rf build kernel source
后来发现提示:rmmod: module 'nls_cp936' not found来自于busybox,并不是来自kernel,
所以使用如下源码生成rmmod命令,就可以没有任何提示的卸载ko模块了[luther.gliethttp]

#include
#include
#include
#include
#include
#include

int main(int argc, char *argv[])
{
const char *modname = argv[1];
int ret = -1;
int maxtry = 10;

while (maxtry-- > 0) {
ret = delete_module(modname, O_NONBLOCK | O_EXCL);//系统调用sys_delete_module

if (ret < 0 && errno == EAGAIN)
usleep(500000);
else
break;
}

if (ret != 0)
printf("Unable to unload driver module \"%s\": %s\n",
modname, strerror(errno));
}

luther@gliethttp:/vobs/tmp$ arm-linux-gcc -o rmmod rmmod.c
luther@gliethttp:/vobs/tmp$ arm-linux-strip -s rmmod
luther@gliethttp:/vobs/tmp$ cp rmmod /vobs/nfs/
这样只需要创建/lib/modules/2.6.30.4空目录就完全可以了.

阅读(3554) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~