Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15497824
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

2009-08-22 18:58:43

必须创建/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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>

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空目录就完全可以了.

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

kangear2013-02-15 22:12:42

不错不错,也知道是成功卸载了,但是还要提示那句话,真气愤!还好是busybox的问题,根据你的提示解决一下看看。我用的开发板是mini2440,它用的busybox是busybox-1.13.3。也让后来者看这篇文章时,能看到。

lanmanck2010-08-12 09:40:08

看不太明白,请问: insmod: module 'hello.ko' not found 是怎么回事?我的目录有ko文件啊。

unix_disciple 2009-09-30 11:04:16

非常好,很受用。以前在宋宝华老师的那本书上看过这部分,其中一个问题一直没搞懂,看了这篇文章后一下子知道问题出在哪里了。