首页 > 代码库 > OK6410 无法rmmod卸载模块 两种解决办法

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

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



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



可以看出我怎么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模式


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



即使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);

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


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









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