# pstore & ramoops

## pstore 介绍
-   pstore 即 persistent
    storage（持久性存储），是一种内核特性，通常用于在 Linux 内核中实现持久化存储机制，允许保存调试信息、崩溃日志或其他重要的内核状态数据，即使在系统重启后，这些信息也可以被保留下来。
-   主要目的是提供一种机制，在系统崩溃或重启后能够保留一些关键信息，帮助开发人员调试和分析问题。

## pstore 原理
-   pstore 是实时的将 log 写入 uncache 内存，所以 pstore 存储数据是能够完整显示重启前的 kernel log，pstore 经常是我们分析异常重启的最重要调试信息。
-   在 X5 平台上，当系统出现异常重启(panic/wdog 等)，此时系统将会进行一次 WarmReset，意味着内存并不会被下电，在下次重启后，用户就能够通过指定节点获取到出现异常 log。

## 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 功能。

## ramoops 介绍
-   ramoops 属于 pstore 系统的一部分。
-   ramoops 将内核的崩溃信息、日志数据或其他关键数据保存到预留的内存区域。并且这个内存区域不会在系统重启时被清除（或至少可以在重启过程中被读取）。


## ramoops 使用方法
### 内核开启 ramoops
-   内核需开启如下选项
```
CONFIG_PSTORE=y
CONFIG_PSTORE_RAM=y
```

### 设置 ramoops 预留内存
-   通过修改 dts 设置 ramoops 使用内存地址空间及内存大小，ramoops 内存不被 Linux 内核所管理，所以需要将这部分内存 reserve。
-   ramoops 的相关设置也是在 reserved_memory 节点下。

    以下是X5系统默认的dts的配置。

    ``` shell
    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
```


