linux内核符号表kallsyms简介

简介: 在使用perf排查问题时,我们经常会发现[kernel.kallsyms]这个模块。这到底是个什么东西呢?

简介:

在2.6版的内核中,为了更方便的调试内核代码,开发者考虑将内核代码中所有函数以及所有非栈变量的地址抽取出来,形成是一个简单的数据块(data blob:符号和地址对应),并将此链接进 vmlinux 中去。

在需要的时候,内核就可以将符号地址信息以及符号名称都显示出来,方便开发者对内核代码的调试。完成这一地址抽取+数据快组织封装功能的相关子系统就称之为 kallsyms。

反之,如果没有 kallsyms 的帮助,内核只能将十六进制的符号地址呈现给外界,因为它能理解的只有符号地址,并不能显示各种函数名等符号。

kallsyms抽取了内核用到的所有函数地址(全局的、静态的)和非栈数据变量地址,生成一个数据块,作为只读数据链接进kernel image,相当于内核中存了一个System.map。

开启kallsyms

要在一个内核中启用 kallsyms 功能。须设置 CONFIG_KALLSYMS 选项为y;如果要在 kallsyms 中包含全部符号信息,须设置 CONFIG_KALLSYMS_ALL 为y

查看kallsyms表:

得益于/proc文件系统,我们可以直接读取这个表。

1 $ less /proc/kallsyms

Example:

01 000000000000a018 D per_cpu__xen_vcpu
02 000000000000a020 D per_cpu__xen_vcpu_info
03 000000000000a060 d per_cpu__mc_buffer
04 000000000000b570 D per_cpu__xen_mc_irq_flags
05 000000000000b578 D per_cpu__xen_cr3
06 000000000000b580 D per_cpu__xen_current_cr3
07 000000000000b5a0 d per_cpu__xen_runstate
08 000000000000b5e0 d per_cpu__xen_runstate_snapshot
09 000000000000b610 d per_cpu__xen_residual_stolen
10 000000000000b618 d per_cpu__xen_residual_blocked
11 000000000000b620 d per_cpu__xen_clock_events
12 000000000000b6a0 d per_cpu__xen_debug_irq
13 000000000000b6a4 d per_cpu__xen_resched_irq
14 000000000000b6a8 d per_cpu__xen_callfunc_irq
15 000000000000b6ac d per_cpu__xen_callfuncsingle_irq

列表的项:

这个应该可以很容易看出,第一列为符号地址,第二列为类型,第三列为符号名。

注意:如果发现符号地址均为0,那是因为系统保护。使用root权限查看即可。

第二列的类型:

有的符号是大写的,有的是小写。大写的符号是全局的。

  1. b 符号在未初始化数据区(BSS)
  2. c 普通符号,是未初始化区域
  3. d 符号在初始化数据区
  4. g 符号针对小object,在初始化数据区
  5. i 非直接引用其他符号的符号
  6. n 调试符号
  7. r 符号在只读数据区
  8. s 符号针对小object,在未初始化数据区
  9. t 符号在代码段
  10. u 符号未定义

转载请注明:云计算技术笔记 » linux内核符号表kallsyms简介

目录
相关文章
|
10天前
|
算法 安全 Linux
探索Linux内核的虚拟内存管理
【5月更文挑战第20天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分之一——虚拟内存管理。通过剖析其关键组件和运作机制,揭示虚拟内存如何提供高效的内存抽象,支持庞大的地址空间,以及实现内存保护和共享。文章将重点讨论分页机制、虚拟内存区域(VMAs)的管理、页面置换算法,并简要分析这些技术是如何支撑起现代操作系统复杂而多变的内存需求的。
|
1天前
|
缓存 算法 安全
探索Linux内核的虚拟内存管理
【5月更文挑战第29天】 在现代操作系统中,虚拟内存是支持多任务处理和内存保护的关键组件。本文深入分析了Linux操作系统中的虚拟内存管理机制,包括其地址空间布局、分页系统以及内存分配策略。我们将探讨虚拟内存如何允许多个进程独立地访问它们自己的地址空间,同时由操作系统管理物理内存资源。此外,文章还将涉及虚拟内存所带来的性能影响及其优化方法。
|
1天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【5月更文挑战第29天】 在现代操作系统中,尤其是类Unix系统如Linux中,进程调度机制是保证多任务高效运行的核心。本文将深入探讨Linux操作系统内核的进程调度器——负责管理CPU资源分配的关键组件。我们会详细分析其调度策略、调度器的演进及其在多核处理器环境下的表现。通过剖析进程调度器的工作原理和设计哲学,旨在为读者提供一个清晰的视角来理解这一复杂的系统功能。
|
8天前
|
存储 算法 Linux
【Linux】程序地址空间 -- 详解 & Linux 2.6 内核进程调度队列 -- 了解
【Linux】程序地址空间 -- 详解 & Linux 2.6 内核进程调度队列 -- 了解
|
9天前
|
算法 Linux 调度
【进程调度】Linux内核的进程调度队列--runqueue
【进程调度】Linux内核的进程调度队列--runqueue
|
9天前
|
缓存 网络协议 算法
Linux内核必读五本书籍(强烈推荐)
Linux内核必读五本书籍(强烈推荐)
40 0
|
15天前
|
NoSQL Ubuntu Linux
【操作系统】实验三 编译 Linux 内核
【操作系统】实验三 编译 Linux 内核
21 1
|
15天前
|
Linux Windows 编译器
|
15天前
|
存储 算法 Linux
【Linux】线程的内核级理解&&详谈页表以及虚拟地址到物理地址之间的转化
【Linux】线程的内核级理解&&详谈页表以及虚拟地址到物理地址之间的转化
|
15天前
|
安全 Linux
【Linux】详解用户态和内核态&&内核中信号被处理的时机&&sigaction信号自定义处理方法
【Linux】详解用户态和内核态&&内核中信号被处理的时机&&sigaction信号自定义处理方法