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前面已经有两根下划线,说明这个函数已经是内核的核心代码,暂时没必要深入了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值