【openwrt学习笔记】Dying Gasp功能和pstore功能的配置(高通 ipq95xx)

2024-01-20 09:40

本文主要是介绍【openwrt学习笔记】Dying Gasp功能和pstore功能的配置(高通 ipq95xx),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 一、Dying Gasp信号
      • 1.1 概念
      • 1.2 实现原理
    • 二、pstore 功能
      • 2.1 概念
      • 2.2 实现原理
    • 三、openwrt中开启pstore功能
      • 3.1 软硬件参数
      • 3.2 各文件修改
        • 3.2.1 defconfig
        • 3.2.2 dts(ipq9574-default-memory.dtsi)
        • 3.2.3 fs/pstore/ram.c
    • 四、测试
      • 4.1 挂载
      • 4.2 触发命令和效果

参考资料:
ADSL的Dying gasp作用
Linux pstore 实现自动“抓捕”内核崩溃日志
Android7.1 RK3399 使用 ramoops 机制查看开机 Kernel Log
Pstore 的一些记录
pstore 工具配置及使用
pstore
The test I have done to pstore/blk

一、Dying Gasp信号

1.1 概念

Dying Gasp(临终之息)是一种通信技术术语,主要用于宽带通信(如DSL,数字用户线路)中。当通信设备(如DSL调制解调器)遇到电源中断或故障时,Dying Gasp信号被发送出去,以通知服务提供商关于这个问题。这个信号可以视为设备的最后一次尝试,表明其即将失去连接或停止工作。

Dying Gasp信号的目的是允许网络运营商和服务提供商快速识别问题,从而更有效地处理故障和提高用户满意度。这个信号有助于避免长时间的故障检测和定位过程,加速恢复服务。

通常,Dying Gasp信号在以下情况下触发:
电源中断:例如,在电力故障、设备过热或设备故障等情况下,设备可能会突然关闭,发送Dying Gasp信号。
硬件故障:例如,当设备内部硬件出现故障,如电源供应器或其他关键组件损坏时,设备可能会发送Dying Gasp信号。

1.2 实现原理

芯片厂商在设计芯片的时候会设计一个Dying gasp 性能模块在芯片内。此模块通过监测外部输入电压来实现Dying gasp功能。
因为为使得此功能能正常使用的前提是芯片必须还能正常工作,并且要向头端发送一定时间长度的信号,所以在论坛定义的Dying gasp信号有效时间内,供芯片正常工作的各种电源的电压不能小于此芯片规格书所描述的最小工作电压。
也就是说,监测点开始启动的电压与芯片各工作电压之差不能小于法定Dying gasp信号时间长度。
Dying Gasp顾名思义 - “死前喘口气”,利用最后存储的一点电能让CPE把最后的状态信息发送出去。 包括两个部分的电路:
1、 大电容储能,当外部输入电源掉电时,存储在大电容中的电能释放能量供整个核心电路再工作需要的喘口气的时间,一般几个ms。电路很简单 - 二极管 大电容(电解的,容量取决于电路板的功耗以及能够正常整流稳压的电压范围) 电压比较器。
2 、ADSL的主芯片有一个输入管脚检测电压比较器的输出电平,一旦触发就可以发出中断信号让系统进入“留遗嘱”状态。

二、pstore 功能

2.1 概念

pstore是persistent storage的缩写。内核发生异常时如果能将日志等信息保存下来不丢失,那么就可以通过这些信息来定位问题。
不同的平台可以提供的存储位置不同,例如有些平台支持硬盘,有些不支持。除了平台差异,异常类型也决定了在发生异常时该存储位置是否还可用。
pstore 的目标是提供一套通用的接口用来存储异常信息。pstore以文件系统的形式提供用户空间接口,可以通过mount命令挂载到指定目录下边,如xxx\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 信息

2.2 实现原理

pstore是Linux内核中的一个功能,它允许在系统崩溃、重启或关机后,保存和检查内核日志和其他相关信息。以下是pstore功能的一些基本实现原理:

  1. 持久存储:pstore使用持久存储(例如NVRAM,非易失性随机存取内存)或者保留区域(例如RAM的特定区域)来存储信息。这些存储区域在系统重启或关机后不会被清除。

  2. 日志和崩溃转储:当系统崩溃,或者由于某些原因,内核需要保存状态信息时,会将这些信息(例如panic信息,oops信息,console日志等)保存到pstore中。

  3. 内核接口:内核提供了一套接口(pstore API),允许内核的其他部分将信息写入到pstore中。

  4. 用户空间访问:在系统重启后,用户空间的程序(例如systemd-journald,kdump等)可以通过文件系统接口(例如/sys/fs/pstore)来访问pstore中的信息,以进行进一步的分析和处理。

三、openwrt中开启pstore功能

3.1 软硬件参数

openwrt版本19.07,但是很多软件包都进行了升级,这个影响不大。芯片是高通ipq9574,比较新的芯片,内核版本5.4。大致了解一下,开整。

root@405BE:/# ubus call system board
{"kernel": "5.4.164","hostname": "*******","model": "****/REV0","board_name": "qcom,ipq9574*****","release": {"distribution": "OpenWrt","version": "19.07-SNAPSHOT","revision": "r0-6ff4ad7","target": "ipq95xx/generic","description": "OpenWrt 19.07-SNAPSHOT r0-6ff4ad7"}
}

3.2 各文件修改

3.2.1 defconfig

新增下列config配置:

CONFIG_PSTORE=y
# CONFIG_PSTORE_DEFLATE_COMPRESS is not set
# CONFIG_PSTORE_LZO_COMPRESS is not set
# CONFIG_PSTORE_LZ4_COMPRESS is not set
# CONFIG_PSTORE_LZ4HC_COMPRESS is not set
# CONFIG_PSTORE_842_COMPRESS is not set
# CONFIG_PSTORE_ZSTD_COMPRESS is not set
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_PMSG=y
CONFIG_PSTORE_RAM=y

注释:若存储空间比较有限,可以将pstore的内容压缩后再保存到backend设备上,相应的压缩算法可以通过配置选项CONFIG_PSTORE_COMPRESS_DEFAULT或模块参数compress指定。上述注释掉的内容就是相关压缩算法,这里暂时不用。

3.2.2 dts(ipq9574-default-memory.dtsi)

高通提供此文件,直接新增就行,文件中有内存信息。

	/*		  Default Profile* +=========+==============+========================+* |        |              |                         |* | Region | Start Offset |          Size           |* |        |              |                         |* +--------+--------------+-------------------------+* |        |              |                         |* |        |              |                         |* |        |              |                         |* |        |              |                         |* | Linux  |  0x42000000  |         123MB           |* |        |              |                         |* |        |              |                         |* |        |              |                         |* +--------+--------------+-------------------------+* |        |              |                         |* |        |              |                         |* | TZ App |  0x49B00000  |           6MB           |* |        |              |                         |* |        |              |                         |* +--------+--------------+-------------------------+* |        |              |                         |* | uboot  |  0x4A100000  |           4MB           |* |        |              |                         |* +--------+--------------+-------------------------+* |  SBL   |  0x4A500000  |           1MB           |* +--------+--------------+-------------------------+* |        |              |                         |* | TZ+HYP |  0x4A600000  |           4MB           |* |        |              |                         |* +--------+--------------+-------------------------+* |  smem  |  0x4AA00000  |           1MB           |* +--------+--------------+-------------------------+* |        |              |                         |* |        |              |                         |* | WLAN   |              |                         |* |   Q6   |  0x4AB00000  |          43MB           |* |        |              |                         |* |        |              |                         |* +--------+--------------+-------------------------+* | M3 Dump|  0x4D600000  |           1MB           |* +--------+--------------+-------------------------+* | WLAN   |              |                         |* | Q6 ETR |  0x4D700000  |           1MB           |* | Region |              |                         |* +--------+--------------+-------------------------+* | caldb  |  0x4D800000  |           5MB           |* +--------+--------------+-------------------------+* |        |              |                         |* |  Pine0 |  0x4DD00000  |          53MB           |* |        |              |                         |* +--------+--------------+-------------------------+* |        |              |                         |* |  Pine1 |  0x51200000  |          53MB           |* |        |              |                         |* +--------+--------------+-------------------------+* |        |              |                         |* |  MHI0  |  0x54700000  |           9MB           |* |        |              |                         |* +--------+--------------+-------------------------+* |        |              |                         |* |  MHI1  |  0x55000000  |           9MB           |* |        |              |                         |* +=================================================+* |                                                 |* |                                                 |* |                                                 |* |            Rest of memory for Linux             |* |                                                 |* |                                                 |* |                                                 |* +=================================================+*/

使用此命令查看到板子里内存情况

# cat proc/iomem

在这里插入图片描述
查看上述dtsi文件,55000000 ~ 55900000 已经使用。 55900000-7fffffff可以使用,所以可以从55900000开始配置一段内存进行使用。

	rampoos_ram: ramoops_ram@55900000  {compatible = "ramoops_ram";reg = <0x0 0x55900000 0x0 0x00140000>;};/*这是一个名为 ramoops_ram@55900000的节点,
这个节点相关的硬件设备是一个RAM-based Oops/Panic logger,它记录内核panic和oops的消息。
名称中的@55900000表示这个设备在物理地址空间中的起始地址。下面是字段的详细解释:
compatible = "ramoops_ram";: 这个属性描述了硬件设备的类型或模型。
在这里,它的值是 ramoops_ram,表示这是一个RAM-based Oops/Panic logger。reg = <0x0 0x55900000 0x0 0x00140000>;: reg属性通常用于描述设备在物理内存中的位置和大小。
在这里,这个设备的起始地址是0x55900000,大小为0x00140000(1.3125MB)。
第一个0x0和第三个0x0通常表示地址空间或者偏移量,在这个例子中,
它们表示该设备是在主地址空间中定义的,没有偏移。
*/
3.2.3 fs/pstore/ram.c
-static ulong ramoops_console_size = MIN_MEM_SIZE;
+static ulong ramoops_console_size = 256*1024UL;-static unsigned long long mem_address;
+static unsigned long long mem_address = 0x55900000;- static ulong mem_size;
+ static ulong mem_size=0x100000;

四、测试

4.1 挂载

上述修改完成后,可以进行编译固件,烧录成功后,直接使用以下命令进行挂载。

mount -t pstore pstore /sys/fs/pstore

4.2 触发命令和效果

# echo c > /proc/sysrq-trigger 

使用此命令可以触发崩溃,重启,生成console-ramoops-0和dmesg-ramoops-0两个文件。
内容大致如下,dmesg-ramoops-0,保存了崩溃时的一些打印。
在这里插入图片描述
console-ramoops-0中书崩溃重启之前,控制台的打印信息。
在这里插入图片描述

注意:只有触发内核崩溃才会有两个文件生成,如果是输入命令重启、开门狗重启、poweroff或者kill触发的重启都只会生成
console-ramoops-0的重启文件。当然,如果是直接断电重启,那么就没有文件生成。

这篇关于【openwrt学习笔记】Dying Gasp功能和pstore功能的配置(高通 ipq95xx)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/625575

相关文章

NGINX 配置内网访问的实现步骤

《NGINX配置内网访问的实现步骤》本文主要介绍了NGINX配置内网访问的实现步骤,Nginx的geo模块限制域名访问权限,仅允许内网/办公室IP访问,具有一定的参考价值,感兴趣的可以了解一下... 目录需求1. geo 模块配置2. 访问控制判断3. 错误页面配置4. 一个完整的配置参考文档需求我们有一

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践举例

《Vue2项目中配置TailwindCSS和FontAwesome的最佳实践举例》:本文主要介绍Vue2项目中配置TailwindCSS和FontAwesome的最... 目录vue 2 项目中配置 Tailwind css 和 Font Awesome 的最佳实践一、Tailwind CSS 配置1. 安

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示