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 解决方法

Linux-insmod/rmmod/lsmod驱动模块相关命令(10)

驱动模块的加载(linux4.1.15)!