__module_text_addres函数根据位于模块代码段的地址,返回这个模块
具体例子在kernel/jump_label.c
struct module *mod;
preempt_disable();
mod = __module_text_address((unsigned long)start);
WARN_ON_ONCE(__module_text_address((unsigned long)end) != mod);
preempt_enable();
可见使用前要通过preempt_disable禁止内核抢占。
struct module *__module_text_address(unsigned long addr)
{
struct module *mod = __module_address(addr);
if (mod) {
/* Make sure it's within the text section. */
if (!within(addr, mod->init_layout.base, mod->init_layout.text_size)
&& !within(addr, mod->core_layout.base, mod->core_layout.text_size))
mod = NULL;
}
return mod;
}
这个函数就是__module_address的一个子函数。其中在__module_address 已经通过within_module 判断这个地址在init_layout或者core_layout 中,不知道在__module_text_address中为啥还要判断一次。
和__module_address想比,__module_address只要是这个模块中的地址就行,而__module_text_address必须是在这个模块中,且必须在text段。条件比__module_address更严格
模块API之__module_text_address
最新推荐文章于 2024-05-01 00:57:14 发布