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
时间: 2024-11-05 22:11:12