OK6410 rmmod卸载模块失败:No such file or directory -- 转
原文地址:http://hi.baidu.com/andio/item/b8be9810282841433a176e86
rmmod chdir no such file or directory
说明:
1. 此文档基于 linux 2.6.32,TQ2440上测试通过,
2. arm-linux-gcc版本
Thread model: posix
gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203)
一. 问题描述及追踪分析
使用 rmmod时候发现如下错误
rmmod chdir no such file or directory
追踪该错误信息,发现busybox rmmod.c 位置 busybox-1.xxx/modutils/rmmod.c
函数框架如下
int rmmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int rmmod_main(int argc UNUSED_PARAM, char **argv)
{
//.......
if (!*argv)
bb_show_usage();
//......
while (*argv) {
char modname[MODULE_NAME_LEN];
const char *bname;
bname = bb_basename(*argv++);
if (n)
safe_strncpy(modname, bname, MODULE_NAME_LEN);
else
filename2modname(bname, modname);
if (bb_delete_module(modname, flags))
bb_error_msg_and_die("can't unload '%s': %s",
modname, moderror(errno));
}
return EXIT_SUCCESS;
}
研究 这个函数,我们发现删除模块的 核心函数 是 bb_delete_module,追踪这个函数,在 /modutils/modutils.c中,我们得到如下函数
int FAST_FUNC bb_delete_module(const char *module, unsigned int flags)
{
errno = 0;
delete_module(module, flags);
return errno;
}
这个表明rmmod实现是依靠 delete_module
继续跟踪delete_module,
#ifdef __UCLIBC__
extern int delete_module(const char *module, unsigned int flags);
#else
# include <sys/syscall.h>
# define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags)
#endif
这个 是什么意思呢?
如果定义了 __UCLIBC__ 则使用uClibc中的 delete_module(const char *module, unsigned int flags)函数
否则,则用系统调用内核的 sys_delete_module函数 该函数原型如下
asmlinkage long sys_delete_module(const char __user * name_user, unsigned int flags);
我们 再来看 safe_strncpy(modname, bname, MODULE_NAME_LEN); 函数和 filename2modname(bname, modname);函数
这俩个函数 的作用都是获得 模块名称 ,使用的核心实现方式是 strrchr(name, '/');
char *strchr(const char *s, int c);
The strrchr() function returns a pointer to the last occurrence of the character c in the string s.
这个意思时说strrchr函数返回字符C在 字符串S中最后一次出现的位置。
假如我们使用如下指令
#rmmod /lib/modules/2.6.32/adc.ko
经过函数处理后, modname 将变回 adc.ko
值得注意的是 bb_basename() 函数如下
const char* FAST_FUNC bb_basename(const char *name)
{
const char *cp = strrchr(name, '/');
if (cp)
return cp + 1;
return name;
} 该函数 已经进行了一次处理
另外, filename2modname 函数
char * FAST_FUNC filename2modname(const char *filename, char *modname)
{
int i;
char *from;
if (filename == NULL)
return NULL;
if (modname == NULL)
modname = xmalloc(MODULE_NAME_LEN);
from = bb_get_last_path_component_nostrip(filename);
for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' &&from[i] != '.'; i++)
modname[i] = (from[i] == '-') ? '_' : from[i];
modname[i] = '\0';
return modname;
}
注意
from[i] != '.' ,这个意味着 adc.ko 会被解析成adc
from[i] == '-'? '_' : from[i]这个意味着 adc-xyz会被解析成adc_xyz
分析到这里,我们也就知道了rmmod的全过程,核心在于利用sys_delete_module函数卸载驱动模块
下面给出解决方法
二. 解决方法
建立rmmod.c ,内容如下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
int ret = -1;
int left_time =5;
int i=0;
if(!argv[1])
{
printf("usage: rmmod modename\n");
return -1;
}
char *modname = argv[1];
while(argv[1][i]!='\0')
{
//如下这个 是为了 rmmod adc.ko 与 rmmod adc效果一致
if(argv[1][i]=='.'){argv[1][i]='\0';break;}
i++;
};
while (left_time-- > 0) {
ret = delete_module(modname, O_NONBLOCK | O_EXCL);//系统调用sys_delete_module
if (ret < 0 && errno == EAGAIN)
sleep(1);
else
break;
}
if (ret != 0) printf("Error when rmmod module %s: %s\n",modname, strerror(errno));
return 0;
}
在PC中
#arm-linux-gcc rmmod.c -o rmmod
在板子中
#mv /sbin/rmmod /sbin/rmmod2
#mv rmmod /sbin/rmmod
OK6410 rmmod卸载模块失败:No such file or directory -- 转的更多相关文章
- rmmod: chdir(/lib/modules): No such file or directory
内核版本:linux3.4.20 交叉编译器:arm-linux-gcc 4.3.3 busybox : busybox 1.20 问题: 使用rmmod会出现 rmmod : chdir(/lib ...
- [转载]rmmod: can't change directory to '/lib/modules': No such file or directory
转载网址:http://blog.csdn.net/chengwen816/article/details/8781096 在我新移植的kernel(3.4.2)和yaffs2文件中,加载新编译的内核 ...
- rmmod: can't change directory to '/lib/modules': No such file or directory
[root@iTOP-4412]# mount /dev/sda1 /mnt/udisk/ [root@iTOP-4412]# insmod /mnt/udisk/linux/hello.ko [ ...
- Angular问题02 创建模块失败、 angular-cli名称问题、升级angular-cli
1 创建模块失败 1.1 问题描述 利用 ng g m 模块名 创建新模块时出错 1.2 错误信息 1.3 问题原因 angular-cli 版本出现问题 1.4 解决办法 卸载掉之前使用的 angu ...
- Sql Server 2008 卸载重新安装失败的解决办法!(多次偿试,方法均有效!)
Sql Server 2008 卸载重新安装失败的解决办法!(多次偿试,方法均有效!) 1.控制面板中卸载所有带sql server的程序. 2.在C盘C:\Program Files中sqlserv ...
- ansible执行shell模块和command模块报错| FAILED | rc=127 >> /bin/sh: lsof: command not found和| rc=2 >> [Errno 2] No such file or directory
命令: ansible -i hosts_20 st -m shell -a 'service zabbix_agentd star' -K --become ansible -i hosts_2 ...
- 5.python之pip安装模块失败
本文是篇水文,主要是在学习python过程中总是遇到使用pip安装一些模块失败,记录一下安装模块解决办法 第一种方法: 首先安装wheel模块: pip install wheel 如果wheel都安 ...
- busybox rmmod error — rmmod: chdir(2.6.25): No such file or directory
busybox rmmod error rmmod: chdir(2.6.25): No such file or directory 1. install your modules in dir / ...
- cnmp安装失败,报错npm ERR! enoent ENOENT: no such file or directory,
1.cnmp安装失败 2.提示如下: bogon:node_modules liangjingming$ sudo npm install cnpm -g --registry=https://reg ...
随机推荐
- 远程修改VMware ESXi服务器的密码(SSH)
1,用vSphere client登录到服务器,将SSH启用. 2,使用ssh连接工具(我用的是secureCRT)远程登录,输入passwd,键入两次新密码,OK.
- 2018最新Web前端经典面试试题及答案
javascript: JavaScript中如何检测一个变量是一个String类型?请写出函数实现 typeof(obj) === "string" typeof obj === ...
- HBase 架构与工作原理2 - HBase 组件
本文系转载,如有侵权,请联系我:likui0913@gmail.com 一.HBase 组件概览 Master-Slave 模式: HBase 体系结构遵循传统的 master-slave 模式,由一 ...
- EasyUseCase 一款脑图转化 Excel 测试用例工具 (1.2 版本升级)
EasyUseCase 本工具由本人自主开发.经过内部实践有效提升测试用例编写效率200% 覆盖率可度量.利用读取xmind软件图表转换符合国人基本需求的测试用例,让手动写Excel用例的日子过去,发 ...
- 【问底】王帅:深入PHP内核(一)——弱类型变量原理探究
来源:CSDN http://www.csdn.net/article/2014-09-15/2821685-exploring-of-the-php 作者:王帅 摘要:PHP作为一门简单而强大 ...
- js本地储存userData实例
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...
- python自动化之web抓取
''' 从web抓取数据: webbrowser:是python自带的,打开浏览器获取指定页面. requests:从因特网上下载文件和网页. Beautiful Soup:解析HTML,即网页编写的 ...
- DPDK环境搭建
一.环境要求 1.内核版本 >= 2.6.34: 2.glibc版本 >= 2.7 (ldd --version 查看glibc版本): 3.gcc版本 >= 4.9,一些gc ...
- PGM学习之二 PGM模型的分类与简介
废话:和上一次的文章确实隔了太久,希望趁暑期打酱油的时间,将之前学习的东西深入理解一下,同时尝试用Python写相关的机器学习代码. 一 PGM模型的分类 通过上一篇文章的介绍,相信大家对PGM的定义 ...
- 初探Java 9 的的模块化
Java 9中最重要的功能,毫无疑问就是模块化(Module),它将自己长期依赖JRE的结构,转变成以Module为基础的组件,当然这在使用Java 9 开发也和以前有着很大的不同. Java8或更加 ...