对应module_put()函数详细用法分享。
第一:函数简介
//函数原型
void module_put(struct module * module)
//函数功能
该函数功能是将一个特定模块module的引用计数减一
这样当一个模块的引用计数不为0而不能被内核卸载的
时候,可以调用该函数一次或多次,实现模块计数清零
从而实现模块卸载
//输入参数说明
module:指向模块结构体的指针,结构体中包含模块名称,状态,所属模块等
第二:函数实例编写
//内核模块函数代码实现
#include <linux/module.h>
#include <linux/init.h>
static int __init module_put_init(void)
{
//待查找的模块名称
const char *name = "hello1";
//调用查找模块函数
struct module *fmodule =find_module(name);
//判断其中的返回值
if(fmodule != NULL)
{
//输出模块的调用次数
printk("before calling module_put\n");
//输出对应的调用次数
printk("refs of %s is %d\n",name,module_refcount(fmodule));
//释放对应的模块
module_put(fmodule);
printk("refs of %s is %d\n",name,module_refcount(fmodule));
}
else
{
printk("find %s is failed\n", name);
}
return 0;
}
//退出函数
static void __exit module_put_exit(void)
{
printk("module exit ok!\n");
}
MODULE_LICENSE("GPL");
module_init(module_put_init);
module_exit(module_put_exit);
第三:案例实现效果
[ 1589.376537] before calling module_put
[ 1589.376580] refs of hello1 is 0
[ 1589.376597] refs of hello1 is -1
[ 1615.096618] module exit ok!
总结:该API函数,可以很好的将对应的模块调用次数进行减一操作,但是使用的过程中如果减到0了就可以卸载了,否则还会继续减成负数(无法卸载)