开篇
上一篇文章分析了内核模块的加载过程:
Linux设备驱动-模块加载过程_一起学嵌入式-CSDN博客
这篇文章来讲讲内核模块的卸载过程机制。
本文引用的内核代码参考来自版本 linux-5.15.4 。
在用户空间,通过指令 rmmod 可以将一个内核模块从系统中卸载,使用方法如下:
rmmod xx /* 卸载已经加载的内核模块 xx */
注意,卸载内核模块需要具有 CAP_SYS_MODULE 权限(root用户或者其他具有这个权限的用户),否则会加载失败。
rmmod 指令通过系统调用 sys_module_module()
完成卸载工作。
系统调用 sys_delete_module
sys_delete_module() 函数原型如下:
long sys_delete_module(const char __user *name_user, unsigned int flags);
参数 name_user 是模块名称。参数 flags 为卸载标志。
函数的具体代码如下(已经将函数名称替换为实际展开后的形式),关键函数添加了注释:
/* <kernel/module.c> */
long sys_delete_module(const char __user *name_user, unsigned in