模块API之__symbol_get/__symbol_put

__symbol_get与__symbol_put是Linux内核中用于管理符号引用计数的函数。__symbol_get根据给定的符号名找到对应的模块,并增加该模块的引用计数;__symbol_put则减少模块的引用计数。这两个函数在内核模块间共享资源时非常重要。
摘要由CSDN通过智能技术生成
__symbol_get/__symbol_put 是一对函数。分别用于根据一个symbol 找到对应的模块后,
将模块的引用计数增加1或者减小1.
其源码分析如下:

void *__symbol_get(const char *symbol)
{
	struct module *owner;
	const struct kernel_symbol *sym;
//find_symbol 会查找module list,因此需要通过preempt_disable 来禁止抢占
	preempt_disable();
//找到symbol 对应的模块
	sym = find_symbol(symbol, &owner, NULL, true, true);
//如果sym不为空,则说明找到,调用strong_try_module_get 将这个模块的引用计数增加1
	if (sym && strong_try_module_get(owner))
		sym = NULL;
	preempt_enable();

	return sym ? (void *)sym->value : NULL;
}



void __symbol_put(const char *symbol)
{
	struct module *owner;

	preempt_disable();
//找到symbol 对应的模块
	if (!find_symbol(symbol, &owner, NULL, true, false))
		BUG();
//module_put 将这个模块的引用计数减小1
	module_put(owner);
	preempt_enable();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值