rmmod命令卸载驱动过程详解
Posted 正在起飞的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rmmod命令卸载驱动过程详解相关的知识,希望对你有一定的参考价值。
1、rmmod命令介绍
(1)rmmod是动态卸载驱动的命令,用法:rmmod xxx.ko;
(2)rmmod是busybox中的一个命令,源码也是在busybox中;
补充:建议同时参考博客,能更深入理解rmmod如何卸载驱动:《insmod命令加载驱动详解》
2、rmmod命令源码函数调用关系
//modutils/rmmod.c
rmmod_main()
bb_delete_module()
delete_module()
3、delete_module()函数源码
# define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags)
调用delete_module()函数实际就是调用内核的sys_delete_module()函数,分析方法和insmod命令加载驱动是一样的,这里不再分析;
4、sys_delete_module()函数分析
4.1、SYSCALL_DEFINE2宏分析
#define __SYSCALL_DEFINEx(x, name, ...) \\
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
#define SYSCALL_DEFINEx(x, sname, ...) \\
__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
4.2、sys_delete_module()函数定义
SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
unsigned int, flags)
//将上面的宏展开
asmlinkage long sys_delete_module(const char __user *name_user,
unsigned int flags);
4.3、sys_delete_module()函数源码
SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
unsigned int, flags)
``````
mod = find_module(name);
``````
if (mod->exit != NULL)
mod->exit();
``````
free_module(mod);
return 0;
(1)find_module(name):根据驱动的名字name,在全局变量“static struct module *modules”中查找驱动对应的struct module结构体;在用insmod命令加载驱动时,会将驱动对应的struct module结构体
注册到modules变量中,modules相当于链表头,通过遍历可以查询所有加载过的驱动;
(2)mod->exit():mod->exit是个函数指针,指向驱动代码中用module_exit宏声明的驱动卸载函数;
(3)free_module(mod):真正卸载驱动的函数;
sys_delete_module()函数调用
//绑定
#define __NR_delete_module 106
__SYSCALL(__NR_delete_module, sys_delete_module)
//引用
syscall(__NR_delete_module, mod, flags)
(1)__SYSCALL()的作用相当于绑定,将__NR_delete_module和sys_delete_module()进行绑定,将来在syscall()调用时进行映射;
(2)sys_delete_module()不是像平常的函数一样直接通过函数名进行调用,需要通过syscall()函数进行间接调用,其中第一个参数__NR_delete_module就是指定调用sys_delete_module()函数;
备注:__SYSCALL()和sysycall()之间如何映射,这里并没有详细分析,__SYSCALL前面已经有两根下划线,说明这个函数已经是内核的核心代码,暂时没必要深入了解。
以上是关于rmmod命令卸载驱动过程详解的主要内容,如果未能解决你的问题,请参考以下文章
卸载驱动出现:rmmod: can't change directory to '/lib/modules': No such file or directory
rmmod: chdir(/lib/modules): No such file or directory 解决方法