crash工具学习 —— percpu相关的一些用法

简介: crash工具学习 —— percpu相关的一些用法

作者

pengdonglin137@163.com

查看percpu变量在每个cpu上的基地址

crash> kmem -o
PER-CPU OFFSET VALUES:
  CPU 0: ffff88807f600000
  CPU 1: ffff88807fa00000
  CPU 2: ffff88813d600000
  CPU 3: ffff88813da00000
  CPU 4: ffff8881bd600000
  CPU 5: ffff8881bda00000
  CPU 6: ffff88823d600000
  CPU 7: ffff88823da00000

查看一个全局的percpu变量的具体值

以下面这个全局percpu变量call_single_queue为例:

static DEFINE_PER_CPU_SHARED_ALIGNED(struct llist_head, call_single_queue);
  • 查看这个percpu变量在每个cpu上的地址
crash> p call_single_queue
PER-CPU DATA TYPE:
  struct llist_head call_single_queue;
PER-CPU ADDRESSES:
  [0]: ffff88807f800340
  [1]: ffff88807fc00340
  [2]: ffff88813d800340
  [3]: ffff88813dc00340
  [4]: ffff8881bd800340
  [5]: ffff8881bdc00340
  [6]: ffff88823d800340
  [7]: ffff88823dc00340
  • 查看其在某些CPU上的具体内容
crash> p call_single_queue:0,2,5-7
per_cpu(call_single_queue, 0) = $5 = {
  first = 0x0
}
per_cpu(call_single_queue, 2) = $6 = {
  first = 0x0
}
per_cpu(call_single_queue, 5) = $7 = {
  first = 0x0
}
per_cpu(call_single_queue, 6) = $8 = {
  first = 0x0
}
per_cpu(call_single_queue, 7) = $9 = {
  first = 0x0
}

根据结构体中percpu变量的偏移地址得到绝对地址

以kmem_cache结构体的成员cpu_cache为例:

struct kmem_cache {
  struct array_cache __percpu *cpu_cache;
/* 1) Cache tunables. Protected by slab_mutex */
  unsigned int batchcount;
  unsigned int limit;
  unsigned int shared;
...
  • 查看偏移量
crash> struct kmem_cache.cpu_slab -x ffff893751f60800
  cpu_slab = 0x5fc135c77b40,

上面cpu_slab的偏移量是0x5fc135c77b40

假如想知道这个成员在cpu10上的地址,下面有2种方法:

  • 绝对值相加

首先获取percpu变量在cpu10上的基地址:

crash> kmem -o | grep "CPU 10"
 CPU 10: ffff88debfd00000

然后相加即可:

crash> eval ffff88debfd00000 + 0x5fc135c77b40
hexadecimal: ffffe89ff5977b40
    decimal: 18446718372450630464  (-25701258921152)
      octal: 1777777211776545675500
     binary: 1111111111111111111010001001111111110101100101110111101101000000

上面将相加后的结果分别按16进制,10进制,8进制以及2进制进行了输出。

  • 使用ptov
crash> ptov 0x5fc135c77b40:10
PER-CPU OFFSET: 5fc135c77b40
  CPU     VIRTUAL
  [10]  ffffe89ff5977b40

这种方法更加方便。

读取percpu变量的内容

还是以kmem_cache为例:

crash> struct kmem_cache.cpu_slab -x ffff893751f60800
cpu_slab = 0x5fc135c77b40,

如果想读取cpu_slab的内容,之前的办法是先得到绝对地址,然后再读取(用*代替struct),其实也可以直接读取,下面的例子读取cpu2上的cpu_slab的内容:

crash> *kmem_cache_cpu 0x5fc135c77b40:2
[2]: ffffe89ff5577b40
struct kmem_cache_cpu {
  freelist = 0x0,
  tid = 2,
  page = 0x0,
  partial = 0x0
}
相关文章
|
Linux C语言
LINUX error: Building GCC requires GMP 4.2+, MPFR 3.1.0+ and MPC 0.8.0+.
LINUX error: Building GCC requires GMP 4.2+, MPFR 3.1.0+ and MPC 0.8.0+.
1674 0
LINUX error: Building GCC requires GMP 4.2+, MPFR 3.1.0+ and MPC 0.8.0+.
|
SQL 开发框架 安全
Linux系统中ARMv8架构u-boot启动流程分析
Linux系统中ARMv8架构u-boot启动流程分析
1078 1
|
监控 调度 开发工具
IO神器blktrace使用介绍
## 前言 1. blktrace的作者正是block io的maintainer,开发此工具,可以更好的追踪IO的过程。 2. blktrace 结合btt可以统计一个IO是在调度队列停留的时间长,还是在硬件上消耗的时间长,利用这个工具可以协助分析和优化问题。 ## blktrace的原理 一个I/O请求的处理过程,可以梳理为这样一张简单的图: ![](http://image
21689 0
|
存储 算法 Linux
打破常规,Linux内核新的数据结构上场maple tree(下)
打破常规,Linux内核新的数据结构上场maple tree
|
10月前
|
存储 机器学习/深度学习 缓存
Google DeepMind发布MoR架构:50%参数超越传统Transformer,推理速度提升2倍
递归混合架构(MoR)通过自适应令牌级计算机制,在降低参数与计算开销的同时超越传统Transformer性能,显著提升推理效率与内存管理,为大模型发展提供新方向。
556 0
Google DeepMind发布MoR架构:50%参数超越传统Transformer,推理速度提升2倍
|
Ubuntu Linux Shell
/etc/rc.d/rc.local 的作用
/etc/rc.d/rc.local是Linux系统中的一个重要配置文件,其主要作用是在系统启动时执行特定的命令或脚本。以下是关于/etc/rc.d/rc.local的详细解释: ### 作用 * **系统启动任务配置**:该文件允许系统管理员或用户配置在系统启动时需要自动运行的任务。这些任务可以是启动服务、运行特定程序或执行脚本等。 * **开机自启动程序**:通过编辑/etc/rc.d/rc.local文件,用户可以自定义开机启动程序。只需将需要开机启动的程序命令或脚本路径添加到该文件中,并在系统启动时该文件将被自动执行。 ### 文件内容 * 通常包含一个shell脚本,该脚本在
1481 12
|
存储 网络协议 大数据
一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)
该文档详细介绍了RDMA(远程直接内存访问)技术的基本原理、主要特点及其编程接口。RDMA通过硬件直接在应用程序间搬移数据,绕过操作系统协议栈,显著提升网络通信效率,尤其适用于高性能计算和大数据处理等场景。文档还提供了RDMA编程接口的概述及示例代码,帮助开发者更好地理解和应用这一技术。
|
运维 NoSQL Ubuntu
深入理解Linux中的"crash"命令:内核崩溃的调试利器
`crash`是Linux内核崩溃调试工具,用于分析内核崩溃转储文件,提供GDB-like的交互式CLI。通过加载`vmcore`文件和内核映像,管理员可以查看系统状态、调用栈、内存布局等。安装`crash`可使用包管理器,如`apt-get`或`yum/dnf`。尽管有学习曲线且依赖转储文件,但`crash`在系统故障排查中极其重要。