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 支持
console
pstore 注册
异常/sys/fs/pstore/console-ramoops-\* 获取。
ramoops
ramoops 指
异常/sys/fs/pstore/dmesg-ramoops-\* 获取。
sched
sched log 是CONFIG_SCHED_LOGGER。
异常/sys/fs/pstore/sched-ramoops-\* 获取。
ftrace
pstore ftrace 功能
该
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