您的位置:首页 > 其它

模块API之lookup_module_symbol_attrs

2017-11-08 08:46 211 查看
static inline int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name)
的作用是返回addr所在模块的size和offset,并返回模块的name和addr代表symbol的name
使用的例子如下:
int lookup_symbol_attrs(unsigned long addr, unsigned long *size,
unsigned long *offset, char *modname, char *name)
{
name[0] = '\0';
name[KSYM_NAME_LEN - 1] = '\0';

if (is_ksym_addr(addr)) {
unsigned long pos;

pos = get_symbol_pos(addr, size, offset);
/* Grab name */
kallsyms_expand_symbol(get_symbol_offset(pos),
name, KSYM_NAME_LEN);
modname[0] = '\0';
return 0;
}
/* See if it's in a module. */
return lookup_module_symbol_attrs(addr, size, offset, modname, name);
}
其源码如下:
int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size,
unsigned long *offset, char *modname, char *name)
{
struct module *mod;
//在查找modules 这个list时,需要通过preempt_disable()/preempt_enable();来禁止内核抢占
preempt_disable();
list_for_each_entry_rcu(mod, &modules, list) {
if (mod->state == MODULE_STATE_UNFORMED)
continue;
if (within_module(addr, mod)) {
const char *sym;
//返回addr在自身模块中的size和offset
sym = get_ksymbol(mod, addr, size, offset);
if (!sym)
goto out;
// 返回addr所在模块的name
if (modname)
strlcpy(modname, mod->name, MODULE_NAME_LEN);
// 返回addr代表的symbol的字符串
if (name)
strlcpy(name, sym, KSYM_NAME_LEN);
preempt_enable();
return 0;
}
}
out:
preempt_enable();
return -ERANGE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: