/proc/kallsyms是 Linux 内核提供的一个动态符号表文件它包含了当前运行内核中所有内核符号函数、变量的地址和名称。这个文件对于内核调试、性能分析如 perf、ftrace和系统监控工具至关重要。1. 基本内容文件每行格式如下内存地址 符号类型 符号名称 [模块名]示例ffffffff81000000 T startup_64 ffffffff81000120 T secondary_startup_64 ffffffff810001a0 T verify_cpu ffffffff81a32000 D __per_cpu_start ffffffff82000000 A __entry_text_start符号类型说明T/t文本代码符号T 表示全局t 表示局部D/d已初始化数据D 表示全局d 表示局部B/b未初始化数据BSS段R/r只读数据A绝对地址不重定位U未定义符号通常来自模块?未知类型2. 主要特点动态性内容随内核运行状态变化如模块加载/卸载地址可能因KASLR内核地址空间布局随机化而每次启动不同权限控制非 root 用户查看时所有符号地址显示为0这是安全措施防止攻击者利用内核地址信息root 用户或具有CAP_SYSLOG权限的进程可看到真实地址包含范围内核核心符号所有已加载内核模块的符号部分架构相关符号3. 主要用途调试与追踪# 查找特定函数地址grepsys_open/proc/kallsyms# 配合 ftrace 使用echosys_open/sys/kernel/debug/tracing/set_ftrace_filter性能分析perf# perf 依赖 kallsyms 解析内核符号perf record-a-g--sleep1perf report内核开发验证符号是否被正确导出查看符号地址布局动态追踪函数调用关系安全分析检测异常内核模块分析 rootkit 可能隐藏的符号4. 相关配置与接口内核配置选项CONFIG_KALLSYMSy # 基本支持 CONFIG_KALLSYMS_ALLy # 包含所有符号包括非全局 CONFIG_KALLSYMS_ABSOLUTE_PERCPUn # 通常关闭用户空间访问// 编程读取示例FILE*fpfopen(/proc/kallsyms,r);// 注意非特权用户只能看到零地址系统控制# 临时禁用地址隐藏仅用于调试echo0/proc/sys/kernel/kptr_restrict# 查看当前设置cat/proc/sys/kernel/kptr_restrict# 值说明# 0 - 所有用户可查看地址# 1 - 仅root可查看默认# 2 - 所有用户都看不到真实地址5. 与 System.map 的区别特性/proc/kallsymsSystem.map来源运行时内核编译时生成地址实际加载地址含KASLR偏移编译时相对地址实时性动态更新模块加载静态权限受 kptr_restrict 控制文件系统权限内容更完整含模块仅内核核心6. 实际应用示例查找系统调用表# 查找系统调用处理函数grepsys_call_table/proc/kallsyms模块分析# 查看特定模块的符号grep\[module_name\]/proc/kallsyms地址转换# 将地址转换为符号名称cat/proc/kallsyms|sort|awk{print $1 $3}sym_map# 然后用于地址解析7. 注意事项生产环境安全保持kptr_restrict1默认性能影响频繁读取大文件可能影响性能地址有效性符号地址仅当前时刻有效模块可卸载虚拟地址显示的是内核虚拟地址非物理地址8. 扩展工具nm vmlinux查看未压缩内核的静态符号readelf -sELF 格式符号查看objdump -t对象文件符号表perf script性能数据符号解析/proc/kallsyms是连接用户空间工具与内核内部细节的关键桥梁为系统监控、调试和分析提供了基础数据支持。