使用rmmod命令移除內核模塊時報Device or resource busy的問題


在Linux下為PCI設備寫驅動程序,發現insmod插入內核模塊正常,但是rmmod時出錯,報下面的錯誤:

rmmod: ERROR: could not remove 'xxxxxx': Device or resource busy
rmmod: ERROR: could not remove module xxxxxx: Device or resource busy

使用lsmod可以看到此模塊的Used by是0,一開始懷疑是自己的代碼有問題,於是精簡了一個最基本的框架,代碼如下:

 1 #include <linux/init.h>
 2 #include <linux/module.h>
 3 
 4 static int __init demo_init(void) {
 5     printk(KERN_INFO "DEMO_INIT");
 6     return 0;
 7 }
 8 
 9 static void __exit demo_exit(void) {
10     printk(KERN_INFO "DEMO_EXIT");
11 }
12 
13 module_init(demo_init);
14 module_exit(demo_exit);

編譯后仍然是insmod正常但rmmod報錯,奇怪的是換一台機器就好了,於是開始比對兩邊環境的差異。正常的環境是CentOS-7.9-x86_64,內核版本3.10.0,gcc版本4.8.5。異常的環境是CentOS-7.9-aarch64,內核版本4.18.0,gcc版本4.8.5。差異在於內核和CPU架構。

於是開始懷疑可能是系統的鍋,多方查找,最后發現是編譯時使用的gcc與系統gcc版本不一致導致的,在異常的環境上查看:

[root@centos145 ~]# dmesg | grep gcc
[ 0.000000] Linux version 4.18.0-193.28.1.el7.aarch64 (mockbuild@aarch64-01.bsys.centos.org) (gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)) #1 SMP Wed Oct 21 16:25:35 UTC 2020

[root@centos145 ~]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-redhat-linux/4.8.5/lto-wrapper
Target: aarch64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-aarch64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-aarch64-redhat-linux/cloog-install --enable-gnu-indirect-function --build=aarch64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)

可以看到gcc分別是8.3.1和4.8.5。而正常的環境上兩者是一致的,均為4.8.5。升級一下gcc應該可以解決,后續可以試下。至於有沒有其它方案有待研究。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM