__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();
}
模块API之__symbol_get/__symbol_put
最新推荐文章于 2023-02-06 19:37:11 发布