模块API之lookup_module_symbol_name
来源:互联网 发布:it职业培训 编辑:程序博客网 时间:2024/06/09 07:25
int lookup_module_symbol_name(unsigned long addr, char *symname) 用于返回addr 对应symbol的name使用的例子如下:int lookup_symbol_name(unsigned long addr, char *symname){symname[0] = '\0';symname[KSYM_NAME_LEN - 1] = '\0';if (is_ksym_addr(addr)) {unsigned long pos;pos = get_symbol_pos(addr, NULL, NULL);/* Grab name */kallsyms_expand_symbol(get_symbol_offset(pos), symname, KSYM_NAME_LEN);return 0;}/* See if it's in a module. */return lookup_module_symbol_name(addr, symname);}其源码分享如下:int lookup_module_symbol_name(unsigned long addr, char *symname){struct module *mod;//在查找modules 这个list的时候,一定要用preempt_disable()/preempt_enable()来禁止内核抢占preempt_disable();list_for_each_entry_rcu(mod, &modules, list) {// 只查找活动的模块,因此如果模块的state等于MODULE_STATE_UNFORMED就跳过这个模块if (mod->state == MODULE_STATE_UNFORMED)continue;//查看这个地址是否在模块的init和core 段中if (within_module(addr, mod)) {const char *sym;//得到这个地址对应的symbol,get_ksymbol 之前的博文分析过,除了能返回当前addr对应的symbol外,还能返回size和offset,由于这里我们用不到,因此直接传NULLsym = get_ksymbol(mod, addr, NULL, NULL);if (!sym)goto out;//由于get_ksymbol得到的symbol是在module的init和core 段,因此通过strlcpy 将这个子串copy到用户的buffer symname 中.strlcpy(symname, sym, KSYM_NAME_LEN);preempt_enable();return 0;}}out:preempt_enable();return -ERANGE;}
阅读全文
0 0
- 模块API之lookup_module_symbol_name
- 模块API之__module_address
- 模块API之__module_text_address
- 模块API之find_module
- 模块API之module_is_live
- 模块API之module_refcount
- 模块API之try_module_get
- 模块API之module_address_lookup
- 模块API之lookup_module_symbol_attrs
- 模块API之module_get_kallsym
- 模块API之print_modules
- 模块API之ref_module
- 模块API之register_module_notifier
- 模块API之each_symbol_section
- 模块API之symbol_put_addr
- 模块API之sprint_symbol
- 模块API之print_symbol
- 模块API之module_put/__module_get
- java多线程问题详解
- 欢迎使用CSDN-markdown编辑器
- 将map映射成实体对象的两种方式 将list映射成对象
- Imagge配置缓存本地文件夹
- 网络安全相关网站
- 模块API之lookup_module_symbol_name
- Zabbix Ubuntu 环境下配置
- Linux Cmake静态库链接
- ImageLoader的基础使用
- 修改Hyperion Planning应用所有者
- jsonp回调
- glog install error
- 一些零散笔记
- kernel中数组元素赋初值