Linux内核中trace_ext4_discard_blocks函数实现位置查询
嘿,这个问题我之前也碰到过!首先得说,trace_ext4_discard_blocks大概率不是手写的汇编函数,而是内核tracepoint框架动态生成的——这也是为什么ctags、cscope这类静态分析工具抓不到它的原因。下面给你几个定位和验证的思路:
1. 先确认是不是tracepoint
内核里以trace_开头的函数,十有八九是tracepoint的封装。你可以在内核源码根目录下跑这个命令,快速定位它的定义源头:
grep -r "trace_ext4_discard_blocks" --include="*.h" --include="*.c" .
通常会在include/trace/events/ext4.h里找到对应的TRACE_EVENT宏定义,结构大概是这样:
TRACE_EVENT(ext4_discard_blocks, TP_PROTO(struct super_block *sb, u64 start, u64 len), TP_ARGS(sb, start, len), TP_STRUCT__entry( __string(dev_name, sb->s_id) __field(u64, start) __field(u64, len) ), TP_fast_assign( __assign_str(dev_name, sb->s_id); __entry->start = start; __entry->len = len; ), TP_printk("dev=%s start=%llu len=%llu", __get_str(dev_name), __entry->start, __entry->len) );
这个宏会在编译阶段自动生成trace_ext4_discard_blocks函数,所以静态工具找不到很正常。你可以去内核编译后生成的build/trace/events/ext4/ext4.h(路径可能根据编译配置略有调整),里面能看到这个函数的具体生成代码。
2. 如果真的怀疑是汇编实现,怎么定位?
要是确认不是tracepoint,那可以通过内核镜像或模块的符号表、反汇编来查找:
- 先用
nm工具查看符号类型:
如果输出里符号类型是nm vmlinux | grep trace_ext4_discard_blocksT(表示在代码段),再用objdump反汇编看它的上下文:
从附近的关联符号,就能推断它属于哪个模块或代码文件。objdump -d vmlinux | grep -A 10 -B 5 trace_ext4_discard_blocks - 另外,内核的汇编文件通常放在
arch/<你的架构>/kernel/或者对应子系统目录(比如ext4的fs/ext4/),你可以直接搜索这些目录下的.S文件:grep -r "trace_ext4_discard_blocks" --include="*.S" .
3. 关于全局定义缺失的问题
如果是编译时提示这个函数未定义,大概率是你没开启对应的tracepoint配置。内核里ext4的tracepoint需要同时开启CONFIG_EXT4_FS、CONFIG_TRACEPOINTS,部分内核版本还需要打开CONFIG_EXT4_FS_TRACE选项。你可以检查.config文件里的配置,或者通过make menuconfig在File systems -> Ext4 filesystem support下找到trace相关的开关。
内容的提问来源于stack exchange,提问作者paavaanan
相关产品推荐
相关产品推荐

