这个问题一度让我觉得很奇怪...
可以看出我怎么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));
}
问题的根源在于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
原文:http://blog.csdn.net/cinmyheart/article/details/38819761