開發板上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生成的一個目錄,


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

發佈了149 篇原創文章 · 獲贊 7 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章