在开发板上insmod模块时,没有问题;但在rmmod模块时,提示"No such file or directory"。lsmod时,该模块时存在的。
root@lingd-arm2410s:/tmp/lingd/gprs2.4# insmod gprs2.4.ko
root@lingd-arm2410s:/tmp/lingd/gprs2.4# rmmod gprs2.4
rmmod: gprs2.4: No such file or directory
问题出在rmmod,通过查看BusyBox-1.11.1源码中modutils/rmmod.c源文件,得知:
* 对于2.6版本内核,rmmod对传递给它的模块文件名作了一些特殊处理(截取到第一个'.',并且将文件名中断的'-'换成'_'),再将处理后的模块名称传递给delete_module
* 但对2.4版本内核,rmmod不对其模块文件名进行处理,而是直接将传递给它的模块文件名传递给delete_module
以上内容通过filename2modname函数实现
/* filename2modname:将模块文件名转换成模块名称 */ static inline void filename2modname(char *modname, const char *afterslash) { unsigned int i; int kr_chk = 1; /* 内核版本标志,1为2.6版本内核,0为2.4版本内核 */
/* 若为2.4版本内核,将kr_chk置为0 */ if (ENABLE_FEATURE_2_4_MODULES && get_linux_version_code() <= KERNEL_VERSION(2,6,0)) kr_chk = 0;
/* Convert to underscores, stop at first . */ /* 循环处理模块文件名中各字符,直到遇到第一个'.' */ for (i = 0; afterslash[i] && afterslash[i] != '.'; i++) { /* 若为2.6版本内核,将文件名中的'-'转换成'_' */ if (kr_chk && (afterslash[i] == '-')) modname[i] = '_'; else modname[i] = afterslash[i]; } modname[i] = '\0'; }
|
因此,在执行rmmod gprs2.4或rmmod gprs2.4.ko时,就变成执行rmmod gprs2。我并没有insmod过一个叫gprs2模块,当然就找到该文件啦!之所以反馈给我们的错误信息是"rmmod: gprs2.4: No such file or directory ",而不是"rmmod: gprs2: No such file or directory ",是因为rmmod打印错误信息时,用的是我们传给它的模块文件名(即gprs2.4),而不是经过处理的模块名称gprs2。
解决方法:
1、最简单的方法:重命名模块文件名,使其不包含'.'字符,除了后缀".ko"
2、比较好的方法(我们可能会在模块文件名里加上版本号,那就无法避免'.'的出现了):修改BusyBox-1.11.1源码中modutils/rmmod.c源文件filename2modname函数的实现:若模块文件名带后缀.ko,将后缀.ko截掉。修改后,filename2modname函数内容如下:
static inline void filename2modname(char *modname, const char *afterslash) { unsigned int i; int kr_chk = 1; unsigned int len; //lingd
if (ENABLE_FEATURE_2_4_MODULES && get_linux_version_code() <= KERNEL_VERSION(2,6,0)) kr_chk = 0;
/********************* lingd ********************/
/* 若模块文件名带.ko后缀,将后缀.ko截掉 */ len = strlen(afterslash); if (strcmp(afterslash + len - 3, ".ko") == 0) len = len - 3; for (i=0; i<len; i++) { /* Convert to underscores, stop at first . */ // for (i = 0; afterslash[i] && afterslash[i] != '.'; i++) {
/********************* lingd ********************/ if (kr_chk && (afterslash[i] == '-')) modname[i] = '_'; else modname[i] = afterslash[i]; } modname[i] = '\0'; } |
其他原因引起的"rmmod: No such file or directory ",可参考以下两篇文章:
阅读(5476) | 评论(1) | 转发(0) |