0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实战案例 | 基于ramoops的kernel panic故障定位技巧

眺望电子 2025-06-06 08:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


前言:

对于嵌入式产品的开发使用,尽管会经历大量的测试和验证,但在大批量生产中,硬件物料的适配一致性,应用软件的异常消息队列等因素,使得现场使用中存在极小概率发生意外状况,出现如 kernel opps、panic等死机现象。这时系统日志无法及时写入 flash,重启后没有存到任何关键信息,工程师也崩溃了。下文则基于眺望电子T113-i核心板产品为例,介绍如何在Linux系统上搭建并验证ramoops, 以便在系统崩溃或异常时进行故障排查。



一、ramoops 简介

ramoops 是一个 oops/panic 日志记录器,它在系统崩溃之前将其日志写入 RAM。它的工作原理是将 oops 和 panic 记录在循环缓冲区中。ramoops 需要具有持久 RAM 的系统,以便该区域的内容在重启后仍然存在。


e3c77d80-426d-11f0-986f-92fbcf53809c.png


二、ramoops 搭建

2.1环境说明

平台: T113-I Tina

SDK : talowe-T113-I-Tina-sdk_2025_03_10.tar.gz

Kernel 版本: 5.4.61

查看系统内存

DRAM 类型: DDR3

[root@T113-I:/]# cat /proc/iomem

e3e71802-426d-11f0-986f-92fbcf53809c.png

可以看到SRAM地址为0x40000000~0x5FFFFFFF,共512M,可以选择kernel code和kernel data以外的地址用作ramoops空间。


2.2内核配置修改

ramoops在内核里面叫pstore ram,源码路径为:

kernel/linux-5.4/fs/pstore/ram_core.c

kernel/linux-5.4/fs/pstore/ram.c

CONFIG_PSTORE_RAM=y # 下面的根据自己需求CONFIG_PSTORE_CONSOLE=y # 保存控制台日志(上一次的)CONFIG_PSTORE_PMSG=y # 用户信息存储,可以往/dev/pmsg0节点写入

设备树配置

reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges;
ramoops@5f000000 { compatible ="ramoops"; reg = <0 0x5f000000 0 0x100000>;//1M内存 record-size = <0x40000>; //oops/panic信息存储 console-size = <0x4000>; //内核信息存储 pmsg-size = <0x4000>; //用户信息存储 no-map; };};


使用参数解析:

reg = <0 0x5f000000 0 0x100000>; 从0x5f000000开始,划分0x100000内存(也就是1M),用于ramoops

record-size = <0x40000>; 分配使用256K来存储oops/panic信息,文件名称为dmesg-ramoops-0

console-size = <0x4000>; 分配使用16K来存储上一次的内核信息,文件名称为console-ramoops-0

pmsg-size = <0x4000>; 分配使用16K来存储用户上一次向/dev/pmsg0节点写入的信息,文件名称为pmsg-ramoops-0

no-map; 必须添加,亦或者修改kernel的内存初始化,将这部分空间预留出来

其他参数:

lecc-size = ;

使用ecc纠错机制,纠错字节数为value,value为1时,使用16字节来纠错,其他值会直接使用

使用ecc会消耗更多内存消耗的内存,消耗的内存与cnt有关,如下面注2,cnt为3,则会消耗3*ecc_value。


注1:size为2的幂向下取整

注2:如果内存划分不规范,可能record的实际大小由(mem_size - console_size - pmsg_size) / record_size决定,如上面例子(0x100000 - 0x4000 - 0x4000)/0x40000,结果向下取整为3,所以record的大小为(0x100000 - 0x4000 - 0x4000)/ 3 ,结果向下取整为330k


2.3系统加载确认

2.3.1 驱动加载查看

将如上修改后的固件镜像烧写到T113-i核心板,进入系统后,使用以下指令查看ramoops内存分配是否成功,如下图显示:成功从0x5f000000开始分配了0x100000(既1M),未启用ECC纠错码(设备树添加ecc-size属性可以开启)

[root@T113-I:/]# dmesg | grep ramoops

e3fd3808-426d-11f0-986f-92fbcf53809c.png

[root@T113-I:/]# cat /proc/iomem

e410b720-426d-11f0-986f-92fbcf53809c.png

5f000000~5f052aa9:330K,用作存储上一次oops/panic信息

5f052aaa~5f0a5553:330K,用作存储上一次oops/panic信息

5f0a5554~5f0f7ffd:330K,用作存储上一次oops/panic信息

5f0f7ffe~5f0fbffd:16K,用作存储上一次系统的内核信息

5f0fbffe~5f0ffffd:16K,用于存储上一次用户自定义信息(向/dev/pmsg0写入的信息)


注3:建议record按照实际大小分配一份即可,因为ramoops使用一个计数器来记录多个转储,但计数器在重启时重置(即,重启后的新转储将覆盖旧转储),所以每次都会将dmesg-ramoops-0覆盖。


2.3.2查看ramoops起始地址(mem_address)

[root@T113-I:/]# cat /sys/module/ramoops/parameters/mem_address[root@T113-I:/]# printf "0x%x\n" $(cat /sys/module/ramoops/parameters/mem_address)

e4281ed8-426d-11f0-986f-92fbcf53809c.png

2.3.3查看ramoops分配大小(mem_size)

[root@T113-I:/]# cat /sys/module/ramoops/parameters/mem_size[root@T113-I:/]# printf "0x%x\n" $(cat /sys/module/ramoops/parameters/mem_size)

e4396f30-426d-11f0-986f-92fbcf53809c.png

2.3.4查看设备树record-size设置(record_size)

[root@T113-I:/]# cat /sys/module/ramoops/parameters/record_size[root@T113-I:/]# printf "0x%x\n" $(cat /sys/module/ramoops/parameters/record_size)

e44d79a8-426d-11f0-986f-92fbcf53809c.png

既256K

2.3.5 查看设备树console-size设置(console_size)

[root@T113-I:/]# cat /sys/module/ramoops/parameters/console_size[root@T113-I:/]# printf "0x%x\n" $(cat /sys/module/ramoops/parameters/console_size)

e4646424-426d-11f0-986f-92fbcf53809c.png

既16K

2.3.6 查看设备树pmsg-size设置(pmsg_size)

[root@T113-I:/]# cat /sys/module/ramoops/parameters/pmsg_size[root@T113-I:/]# printf "0x%x\n" $(cat /sys/module/ramoops/parameters/pmsg_size)

e4797706-426d-11f0-986f-92fbcf53809c.png

既16K

2.3.7 查看是否开启ecc纠错(ecc)

[root@T113-I:/]# cat /sys/module/ramoops/parameters/ecc

e48f47c0-426d-11f0-986f-92fbcf53809c.png

0:未开启

非0:开启,使用该值的字节进行纠错


2.3.8 查看存储哪些的内核信息类型(dump_oops)

[root@T113-I:/]# cat /sys/module/ramoops/parameters/dump_oops

e4a3b124-426d-11f0-986f-92fbcf53809c.png

1:存储panic和oops

2:跳过oops存储,只存储panic

其他:请查看kernel/linux-5.4/include/linux/kmsg_dump.h和ramoops的ramoops_pstore_write函数


三、ramoops机制验证

3.1触发panic测试

[root@T113-I:/]# echo 5 > /proc/sys/kernel/panic # 设置触发panic时,5秒后重启[root@T113-I:/]# echo c > /proc/sysrq-trigger# 触发panic

e4b8997c-426d-11f0-986f-92fbcf53809c.png

重启后,挂载pstore系统查看日志

[root@T113-I:/]# mount -t pstore pstore /sys/fs/pstore/[root@T113-I:/]# ls /sys/fs/pstore/[root@T113-I:/]# tail -n 20 /sys/fs/pstore/dmesg-ramoops-0#防止信息太多,只看之后20行

如下图,可以看到前面的系统时间与内容和崩溃时打印的一模一样,同时前面多了日志等级标记

e4ccad0e-426d-11f0-986f-92fbcf53809c.png

同时,console-ramoops-0也会有以上信息,这里只看最后10行方便对比

[root@T113-I:/]# tail -n 10 /sys/fs/pstore/dmesg-ramoops-0[root@T113-I:/]# tail -n 10 /sys/fs/pstore/console-ramoops-0

e4e0a714-426d-11f0-986f-92fbcf53809c.png

3.2ramoops文件对比

由上一小节panic的测试可以看到console-ramoops-0的日志内容和dmesg-ramoops-0的日志内容一模一样,两者的区别是console-ramoops-0为reboot前的内核所有信息,dmesg-ramoops-0为上一次触发panic/oops时内核的所有信息

在上小节测试完成后,执行reboot,系统重新启动后可以看到信息不一致,console为上一次内核信息

[root@T113-I:/]# mount -t pstore pstore /sys/fs/pstore/[root@T113-I:/]# tail -n 10 /sys/fs/pstore/dmesg-ramoops-0[root@T113-I:/]# tail -n 10 /sys/fs/pstore/console-ramoops-0

3.3用户自定义pmsg-ramoops

写入信息

[root@T113-I:/]# echo 123 > /dev/pmsg0[root@T113-I:/]# echo 456 > /dev/pmsg0[root@T113-I:/]# reboot[root@T113-I:/]# mount -t pstore pstore /sys/fs/pstore/[root@T113-I:/]# cat /sys/fs/pstore/pmsg-ramoops-0

e4f32bbe-426d-11f0-986f-92fbcf53809c.pnge5062ba6-426d-11f0-986f-92fbcf53809c.png


四、小结

以上则是基于ramoops在全志T113-i平台上的简单使用技巧,若您也有linux系统方面的问题或想了解更多相关技术知识或产品信息,请关注眺望电子公众号并联系我们,我们将竭诚为您服务!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20145

    浏览量

    328763
  • 故障定位
    +关注

    关注

    0

    文章

    157

    浏览量

    9908
  • Kernel
    +关注

    关注

    0

    文章

    49

    浏览量

    11989
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    鸿蒙实战开发:【FaultLoggerd组件】讲解

    Faultloggerd部件是OpenHarmony中C/C++运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件,Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到
    的头像 发表于 03-12 16:22 1878次阅读
    鸿蒙<b class='flag-5'>实战</b>开发:【FaultLoggerd组件】讲解

    挂载文件系统出现"kernel panic..." 史上最全解决方案

    defaults...Kernel panic - not syncing: No init found.Try passing init=optionto kernel. bootargs为
    发表于 08-01 16:31

    kernel移植报错

    最近移植4.14的内核,烧到开发板中出现如下错误:---[ end trace 1c64f040d891693a ]---Kernel panic - not syncing: Attempted
    发表于 02-25 15:51

    如何精准定位电缆故障

    华天电力专业生产电缆故障测试仪,接下来为大家分享如何精准定位电缆故障。电力部门经常对电缆进行大修,遇到电缆故障时如何正确处理?下面是对电缆故障
    发表于 03-28 11:37

    Kernel panic - not syncing: No init found

    我按韦老师的教学视频制作UBOOT\KERNEL,走了整个流程,最后甚至把老师的补丁拿来直接使用,只有文件系统是自己做的,但是,始终过不了“Kernel panic - not syncing
    发表于 05-14 07:45

    配置nfs启动出现kernel panic

    an initial console.Failed to execute /linuxrc.Attempting defaults...Kernel panic - not syncing
    发表于 05-17 07:45

    分享几种RK3399开启ramoops查看kernel log的方法

    后端|-> Log panic/oops to a block device # pstore/blk 后端验证step1:echo 1 > /proc/sys/kernel
    发表于 11-14 18:04

    nuc980不管如何都是开不起来kernel panic是怎么回事?

    ?) 010f16384 ram15(driver?) Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0
    发表于 06-13 08:19

    Linux Kernel Panic的产生的原因?

    时导致panic。 使用内核调试工具(kenrel debugger ,aka KDB) 如果跟踪信息只有一部分且不足以用来定位问题的根本原因时,kernel debugger(KDB)就需要
    发表于 06-15 06:24

    笔记本启动故障修复实战

    笔记本启动故障修复实战 同学使用的一台IBM T23笔记本电脑,一个月前出现了偶尔不能启动的故障,由于出现故障的频率不高所以并未
    发表于 01-23 11:21 728次阅读

    kernel panic流程分析

    我们在项目开发过程中,很多时候会出现由于某种原因经常会导致手机系统死机重启的情况(重启分Android重启跟kernel重启,而我们这里只讨论kernel重启也就是 kernel panic
    的头像 发表于 01-19 16:14 1858次阅读
    <b class='flag-5'>kernel</b> <b class='flag-5'>panic</b>流程分析

    深入分析内核panic的内核错误处理方案

    die函数主要执行oops相关流程,且若异常为中断流程中触发或设置了panic_on_oops选项,则进一步通过panic将系统挂起。
    发表于 04-14 15:18 4722次阅读

    嵌入式Linux上使用Ramoops的代码应用

    ramoops 还没有配置完成,需要在 device tree里创建对应的节点。在这之前先确定在内存中可以为 ramoops 预留的地址空间。在 Linux 运行下面命令。
    的头像 发表于 12-06 11:18 1658次阅读
    嵌入式Linux上使用<b class='flag-5'>Ramoops</b>的代码应用

    配网行波故障预警与定位装置的故障定位精度等级划分

    今天江苏宇拓电力科技来为大家说明一下配网行波故障预警与定位装置的故障定位精度等级划分。 摘要:随着电力系统的不断发展,配网行波故障预警与
    的头像 发表于 12-22 15:02 3598次阅读

    鸿蒙实战开发学习【FaultLoggerd组件】

    Faultloggerd部件是OpenHarmony中C/C++运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件,Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到
    的头像 发表于 03-17 20:39 1285次阅读
    鸿蒙<b class='flag-5'>实战</b>开发学习【FaultLoggerd组件】