码迷,mamicode.com
首页 > 其他好文 > 详细

OK6410 无法rmmod卸载模块 两种解决办法

时间:2014-08-25 14:59:54      阅读:361      评论:0      收藏:0      [点我收藏+]

标签:linux   kernel modules   rmmod   

OK6410  无法rmmod卸载模块  两种解决办法



                        这个问题一度让我觉得很奇怪...

bubuko.com,布布扣


可以看出我怎么rmmod都没用,那个模块就在那里...我换用了rmmod_by_EOF就没事了~


方法一:

                 这个开发板自带文件系统的rmmod命令不行,在好心bloger的帮助下,自己重新编译一个

#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));

}

用arm-linux-gcc 交叉编译工具编译这个程序,然后放到开发板上,即可卸载模块






方法二:

问题的根源在于OK6410自带的zImage内核的模块处于permanent模式


国外的一个网站上有提到这个问题

bubuko.com,布布扣


即使kernel在.config里面选择了可以卸载模块也没用,模块内部源文件一开始就要定义个Macro——USE_IMMEDIATE

处于premanent模式的内核加载module之后是永久加载,rmmod是搞不定的,这时候要在module的源文件内部添加USE_IMMEDIATE宏定义


demo:

#include <linux/module.h>
#include <linux/init.h>

#define USE_IMMEDIATE

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
	printk(KERN_ALERT "defined Macro USE_IMMEDIATE\n");
	printk(KERN_ALERT "hello world!\n");
	return 0;
}

static void hello_exit(void)
{
	printk(KERN_ALERT "I am back.kernel in planet Linux!\n");
}

module_init(hello_init);
module_exit(hello_exit);

bubuko.com,布布扣

有点问题就是这里会出现一个rmmod:module ‘xx‘ not found的报错,这个和rmmod的实现有关系了~


以后换个busybox  再试试,现在~现就这样吧,以后换kernel的时候再update







bubuko.com,布布扣


OK6410 无法rmmod卸载模块 两种解决办法

标签:linux   kernel modules   rmmod   

原文地址:http://blog.csdn.net/cinmyheart/article/details/38819761

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!