4.6.1. pstore & ramoops
4.6.1.1. pstore 介绍
pstore 即 persistent storage(持久性存储),是一种内核特性,通常用于在 Linux 内核中实现持久化存储机制,允许保存调试信息、崩溃日志或其他重要的内核状态数据,即使在系统重启后,这些信息也可以被保留下来。
主要目的是提供一种机制,在系统崩溃或重启后能够保留一些关键信息,帮助开发人员调试和分析问题。
4.6.1.2. pstore 原理
pstore 是实时的将 log 写入 uncache 内存,所以 pstore 存储数据是能够完整显示重启前的 kernel log,pstore 经常是我们分析异常重启的最重要调试信息。
在 X5 平台上,当系统出现异常重启(panic/wdog 等),此时系统将会进行一次 WarmReset,意味着内存并不会被下电,在下次重启后,用户就能够通过指定节点获取到出现异常 log。
4.6.1.3. pstore 类型
pstore 支持下面几种 log 信息:
console
pstore 注册了一个 console,输出到串口 console 的 log 都会同步写入 pstore 指定的地址中,所以 log 是和串口输出内容一样的(受 log
level 的管控),该段内存通过 ringbuffer 管理。
异常重启后,可以从 /sys/fs/pstore/console-ramoops-\* 获取。
ramoops
ramoops 指的是采用 ram 保存 oops 信息的一个功能,通过在系统异常重启(panic/oops)的关键路径中 dump kmsg,实现 log 保存,相较于 console,ramoops 是不受 log level 控制的,可以作为 console log 的补充。
异常重启后,可以从 /sys/fs/pstore/dmesg-ramoops-\* 获取。
sched
sched log 是用于分析系统重启前调度问题的 log 机制,能够保存重启前各个 CPU 上的调度信息,对于分析 wdog 等问题有非常大的帮助,该功能需要开启 CONFIG_SCHED_LOGGER。
异常重启后,可以通过 /sys/fs/pstore/sched-ramoops-\* 获取。
ftrace
pstore ftrace 功能可以用来追踪一些重启前出现的软/硬件 hang 的问题,能够获取到函数调用的 trace。
该功能默认关闭,对系统负载影响较大,不建议使用,推荐使用 sched 功能。
4.6.1.4. ramoops 介绍
ramoops 属于 pstore 系统的一部分。
ramoops 将内核的崩溃信息、日志数据或其他关键数据保存到预留的内存区域。并且这个内存区域不会在系统重启时被清除(或至少可以在重启过程中被读取)。
4.6.1.5. ramoops 使用方法
内核开启 ramoops
内核需开启如下选项
CONFIG_PSTORE=y
CONFIG_PSTORE_RAM=y
设置 ramoops 预留内存
通过修改 dts 设置 ramoops 使用内存地址空间及内存大小,ramoops 内存不被 Linux 内核所管理,所以需要将这部分内存 reserve。
ramoops 的相关设置也是在 reserved_memory 节点下。
以下是X5系统默认的dts的配置。
ramoops@d5000000 { compatible = "ramoops"; reg = <0x0 0xd5000000 0x0 0x40000>; console-size = <0x8000>; pmg-size = <0x8000>; ftrace-size = <0x8000>; sched-size = <0x8000>; record-size = <0x4000>; ecc-size = <0x0>; };
内核触发 kernel panic
内核可通过 sysrq 主动触发 kernel panic,检查 pstore 机制是否生效
echo c > /proc/sysrq-trigger
检查 ramoops 生效
当发生异常重启后,X5平台通过 pstore 获取到 kernel log 后,转存到了 /userdata/log/pstore/
root@buildroot:~# ls -al /userdata/log/pstore/X5_Pstore-0017-1970_01_01_00_00_03/
total 76
drwxr-xr-x 2 root root 4096 Oct 15 2024 .
drwxr-xr-x 3 root root 4096 Jan 1 00:00 ..
-r--r--r-- 1 root root 1391 Jan 1 00:00 console-ramoops-0
-r--r--r-- 1 root root 27248 Jan 1 00:00 dmesg-ramoops-0
-r--r--r-- 1 root root 33922 Jan 1 00:00 sched-ramoops-0