What is pstore?
pstore, persistent storage
, 是一个存储内核日志或者内核 panic 的文件系统,内核会把相关信息存储在一个不能被其他用户重写的指定 RAM 区域,下一次启动时,这个区域会被挂载到 /pstore
,一般在 /sys/fs/pstore
, 这样我们就可以访问这些数据了。
pstore 在内核中的开关是 CONFIG_PSTORE,pstore 提供的是一套可扩展的机制,提供如下类型:
- PSTORE_TYPE_DMESG, 表示内核日志
- PSTORE_TYPE_MCE, 表示硬件错误
- PSTORE_TYPE_CONSOLE, 表示控制台输出,所有内核信息。
- PSTORE_TYPE_FTRACE, 表示函数调用序列, ftrace 信息。
ramoops 指的是采用 ram 保存 oops 信息的一个功能,这个功能从 3.10.40 开始采用 pstore 机制来实现,内核中的开关控制:
- PSTORE_PMSG,用户空间信息,/dev/pmsg0,pmsg-ramoops-
- PSTORE_CONSOLE,控制台输出,所有内核信息,console-ramoops-
- PSTORE_FTRACE,函数调用序列, ftrace 信息。
- PSTORE_RAM, panic/oops 信息
How to config?
用我本地的 SDM660 和 MSM8909 平台源码配置 pstore 时,按照如下方式可以实现:
1 | // kernel/msm-4.14/arch/arm64/configs/vendor/sdm660_defconfig |
基于我的实验,在 SM6125 平台按照如下方式修改可以使 ramoops 正常工作。
1 | // arch/arm64/boot/dts/qcom/trinket.dtsi |
Where does sysfs create?
我们可以在 /sys/fs/pstore/*
看到加载的 pstore
数据,如下:
1 | ls /sys/fs/pstore/ |
其来自于如下源码:
1 | // /kernel/msm-4.4/fs/pstore/inode.c#300 |
How to test?
1 | # 检查 pstore 配置成功与否。 |
How to debug?
在
msm_restart_probe
中加日志确认 PMIC 是被配置为 warm reset mode。如果需要为未知重启保存
pstore
日志,需要确认XBL
中正确设置了 PSHOLD trigger 为 PMIC warm reset mode。查看
pstore
setup 流程:1
2
3
4ramoops_init
ramoops_register_dummy
ramoops_probe
ramoops_register查看
pstore
数据保存流程:1
2
3
4register a pstore_dumper
// when panic happens, kmsg_dump is called
call dumper->dump
pstore_dump查看
pstore
数据读取流程:1
2
3
4
5
6
7ramoops_probe
persistent_ram_post_init
pstore_register
pstore_get_records
ramoops_pstore_read
pstore_decompress (only for dmesg)
pstore_mkfile (save to files)