99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

實(shí)戰(zhàn)案例 | 基于ramoops的kernel panic故障定位技巧

眺望電子 ? 2025-06-06 08:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


前言:

對(duì)于嵌入式產(chǎn)品的開(kāi)發(fā)使用,盡管會(huì)經(jīng)歷大量的測(cè)試和驗(yàn)證,但在大批量生產(chǎn)中,硬件物料的適配一致性,應(yīng)用軟件的異常消息隊(duì)列等因素,使得現(xiàn)場(chǎng)使用中存在極小概率發(fā)生意外狀況,出現(xiàn)如 kernel opps、panic等死機(jī)現(xiàn)象。這時(shí)系統(tǒng)日志無(wú)法及時(shí)寫(xiě)入 flash,重啟后沒(méi)有存到任何關(guān)鍵信息,工程師也崩潰了。下文則基于眺望電子T113-i核心板產(chǎn)品為例,介紹如何在Linux系統(tǒng)上搭建并驗(yàn)證ramoops, 以便在系統(tǒng)崩潰或異常時(shí)進(jìn)行故障排查。



一、ramoops 簡(jiǎn)介

ramoops 是一個(gè) oops/panic 日志記錄器,它在系統(tǒng)崩潰之前將其日志寫(xiě)入 RAM。它的工作原理是將 oops 和 panic 記錄在循環(huán)緩沖區(qū)中。ramoops 需要具有持久 RAM 的系統(tǒng),以便該區(qū)域的內(nèi)容在重啟后仍然存在。


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


二、ramoops 搭建

2.1環(huán)境說(shuō)明

平臺(tái): T113-I Tina

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

Kernel 版本: 5.4.61

查看系統(tǒng)內(nèi)存

DRAM 類(lèi)型: DDR3

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

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

可以看到SRAM地址為0x40000000~0x5FFFFFFF,共512M,可以選擇kernel code和kernel data以外的地址用作ramoops空間。


2.2內(nèi)核配置修改

ramoops在內(nèi)核里面叫pstore ram,源碼路徑為:

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

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

CONFIG_PSTORE_RAM=y # 下面的根據(jù)自己需求CONFIG_PSTORE_CONSOLE=y # 保存控制臺(tái)日志(上一次的)CONFIG_PSTORE_PMSG=y # 用戶(hù)信息存儲(chǔ),可以往/dev/pmsg0節(jié)點(diǎn)寫(xiě)入

設(shè)備樹(shù)配置

reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges;
ramoops@5f000000 { compatible ="ramoops"; reg = <0?0x5f000000?0?0x100000>;//1M內(nèi)存 record-size = <0x40000>; //oops/panic信息存儲(chǔ) console-size = <0x4000>; //內(nèi)核信息存儲(chǔ) pmsg-size = <0x4000>; //用戶(hù)信息存儲(chǔ) no-map; };};


使用參數(shù)解析:

reg = <0 0x5f000000 0 0x100000>; 從0x5f000000開(kāi)始,劃分0x100000內(nèi)存(也就是1M),用于ramoops

record-size = <0x40000>; 分配使用256K來(lái)存儲(chǔ)oops/panic信息,文件名稱(chēng)為dmesg-ramoops-0

console-size = <0x4000>; 分配使用16K來(lái)存儲(chǔ)上一次的內(nèi)核信息,文件名稱(chēng)為console-ramoops-0

pmsg-size = <0x4000>; 分配使用16K來(lái)存儲(chǔ)用戶(hù)上一次向/dev/pmsg0節(jié)點(diǎn)寫(xiě)入的信息,文件名稱(chēng)為pmsg-ramoops-0

no-map; 必須添加,亦或者修改kernel的內(nèi)存初始化,將這部分空間預(yù)留出來(lái)

其他參數(shù):

lecc-size = ;

使用ecc糾錯(cuò)機(jī)制,糾錯(cuò)字節(jié)數(shù)為value,value為1時(shí),使用16字節(jié)來(lái)糾錯(cuò),其他值會(huì)直接使用

使用ecc會(huì)消耗更多內(nèi)存消耗的內(nèi)存,消耗的內(nèi)存與cnt有關(guān),如下面注2,cnt為3,則會(huì)消耗3*ecc_value。


注1:size為2的冪向下取整

注2:如果內(nèi)存劃分不規(guī)范,可能record的實(shí)際大小由(mem_size - console_size - pmsg_size) / record_size決定,如上面例子(0x100000 - 0x4000 - 0x4000)/0x40000,結(jié)果向下取整為3,所以record的大小為(0x100000 - 0x4000 - 0x4000)/ 3 ,結(jié)果向下取整為330k


2.3系統(tǒng)加載確認(rèn)

2.3.1 驅(qū)動(dòng)加載查看

將如上修改后的固件鏡像燒寫(xiě)到T113-i核心板,進(jìn)入系統(tǒng)后,使用以下指令查看ramoops內(nèi)存分配是否成功,如下圖顯示:成功從0x5f000000開(kāi)始分配了0x100000(既1M),未啟用ECC糾錯(cuò)碼(設(shè)備樹(shù)添加ecc-size屬性可以開(kāi)啟)

[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,用作存儲(chǔ)上一次oops/panic信息

5f052aaa~5f0a5553:330K,用作存儲(chǔ)上一次oops/panic信息

5f0a5554~5f0f7ffd:330K,用作存儲(chǔ)上一次oops/panic信息

5f0f7ffe~5f0fbffd:16K,用作存儲(chǔ)上一次系統(tǒng)的內(nèi)核信息

5f0fbffe~5f0ffffd:16K,用于存儲(chǔ)上一次用戶(hù)自定義信息(向/dev/pmsg0寫(xiě)入的信息)


注3:建議record按照實(shí)際大小分配一份即可,因?yàn)閞amoops使用一個(gè)計(jì)數(shù)器來(lái)記錄多個(gè)轉(zhuǎn)儲(chǔ),但計(jì)數(shù)器在重啟時(shí)重置(即,重啟后的新轉(zhuǎn)儲(chǔ)將覆蓋舊轉(zhuǎn)儲(chǔ)),所以每次都會(huì)將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分配大?。╩em_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查看設(shè)備樹(shù)record-size設(shè)置(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 查看設(shè)備樹(shù)console-size設(shè)置(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 查看設(shè)備樹(shù)pmsg-size設(shè)置(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 查看是否開(kāi)啟ecc糾錯(cuò)(ecc)

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

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

0:未開(kāi)啟

非0:開(kāi)啟,使用該值的字節(jié)進(jìn)行糾錯(cuò)


2.3.8 查看存儲(chǔ)哪些的內(nèi)核信息類(lèi)型(dump_oops)

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

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

1:存儲(chǔ)panic和oops

2:跳過(guò)oops存儲(chǔ),只存儲(chǔ)panic

其他:請(qǐng)查看kernel/linux-5.4/include/linux/kmsg_dump.h和ramoops的ramoops_pstore_write函數(shù)


三、ramoops機(jī)制驗(yàn)證

3.1觸發(fā)panic測(cè)試

[root@T113-I:/]# echo 5 > /proc/sys/kernel/panic # 設(shè)置觸發(fā)panic時(shí),5秒后重啟[root@T113-I:/]# echo c > /proc/sysrq-trigger# 觸發(fā)panic

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

重啟后,掛載pstore系統(tǒng)查看日志

[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行

如下圖,可以看到前面的系統(tǒng)時(shí)間與內(nèi)容和崩潰時(shí)打印的一模一樣,同時(shí)前面多了日志等級(jí)標(biāo)記

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

同時(shí),console-ramoops-0也會(huì)有以上信息,這里只看最后10行方便對(duì)比

[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文件對(duì)比

由上一小節(jié)panic的測(cè)試可以看到console-ramoops-0的日志內(nèi)容和dmesg-ramoops-0的日志內(nèi)容一模一樣,兩者的區(qū)別是console-ramoops-0為reboot前的內(nèi)核所有信息,dmesg-ramoops-0為上一次觸發(fā)panic/oops時(shí)內(nèi)核的所有信息

在上小節(jié)測(cè)試完成后,執(zhí)行reboot,系統(tǒng)重新啟動(dòng)后可以看到信息不一致,console為上一次內(nèi)核信息

[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用戶(hù)自定義pmsg-ramoops

寫(xiě)入信息

[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


四、小結(jié)

以上則是基于ramoops在全志T113-i平臺(tái)上的簡(jiǎn)單使用技巧,若您也有l(wèi)inux系統(tǒng)方面的問(wèn)題或想了解更多相關(guān)技術(shù)知識(shí)或產(chǎn)品信息,請(qǐng)關(guān)注眺望電子公眾號(hào)并聯(lián)系我們,我們將竭誠(chéng)為您服務(wù)!

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5150

    文章

    19665

    瀏覽量

    317427
  • 故障定位
    +關(guān)注

    關(guān)注

    0

    文章

    148

    瀏覽量

    9780
  • Kernel
    +關(guān)注

    關(guān)注

    0

    文章

    49

    瀏覽量

    11682
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    鴻蒙實(shí)戰(zhàn)開(kāi)發(fā):【FaultLoggerd組件】講解

    Faultloggerd部件是OpenHarmony中C/C++運(yùn)行時(shí)崩潰臨時(shí)日志的生成及管理模塊。面向基于 Rust 開(kāi)發(fā)的部件,F(xiàn)aultloggerd 提供了Rust Panic故障日志生成能力。系統(tǒng)開(kāi)發(fā)者可以在預(yù)設(shè)的路徑下找到
    的頭像 發(fā)表于 03-12 16:22 ?1494次閱讀
    鴻蒙<b class='flag-5'>實(shí)戰(zhàn)</b>開(kāi)發(fā):【FaultLoggerd組件】講解

    掛載文件系統(tǒng)出現(xiàn)"kernel panic..." 史上最全解決方案

    defaults...Kernel panic - not syncing: No init found.Try passing init=optionto kernel. bootargs為
    發(fā)表于 08-01 16:31

    kernel移植報(bào)錯(cuò)

    最近移植4.14的內(nèi)核,燒到開(kāi)發(fā)板中出現(xiàn)如下錯(cuò)誤:---[ end trace 1c64f040d891693a ]---Kernel panic - not syncing: Attempted
    發(fā)表于 02-25 15:51

    如何精準(zhǔn)定位電纜故障

    華天電力專(zhuān)業(yè)生產(chǎn)電纜故障測(cè)試儀,接下來(lái)為大家分享如何精準(zhǔn)定位電纜故障。電力部門(mén)經(jīng)常對(duì)電纜進(jìn)行大修,遇到電纜故障時(shí)如何正確處理?下面是對(duì)電纜故障
    發(fā)表于 03-28 11:37

    Kernel panic - not syncing: No init found

    我按韋老師的教學(xué)視頻制作UBOOT\KERNEL,走了整個(gè)流程,最后甚至把老師的補(bǔ)丁拿來(lái)直接使用,只有文件系統(tǒng)是自己做的,但是,始終過(guò)不了“Kernel panic - not syncing
    發(fā)表于 05-14 07:45

    配置nfs啟動(dòng)出現(xiàn)kernel panic

    an initial console.Failed to execute /linuxrc.Attempting defaults...Kernel panic - not syncing
    發(fā)表于 05-17 07:45

    分享幾種RK3399開(kāi)啟ramoops查看kernel log的方法

    后端|-> Log panic/oops to a block device # pstore/blk 后端驗(yàn)證step1:echo 1 > /proc/sys/kernel
    發(fā)表于 11-14 18:04

    nuc980不管如何都是開(kāi)不起來(lái)kernel panic是怎么回事?

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

    Linux Kernel Panic的產(chǎn)生的原因?

    時(shí)導(dǎo)致panic。 使用內(nèi)核調(diào)試工具(kenrel debugger ,aka KDB) 如果跟蹤信息只有一部分且不足以用來(lái)定位問(wèn)題的根本原因時(shí),kernel debugger(KDB)就需要
    發(fā)表于 06-15 06:24

    筆記本啟動(dòng)故障修復(fù)實(shí)戰(zhàn)

    筆記本啟動(dòng)故障修復(fù)實(shí)戰(zhàn) 同學(xué)使用的一臺(tái)IBM T23筆記本電腦,一個(gè)月前出現(xiàn)了偶爾不能啟動(dòng)的故障,由于出現(xiàn)故障的頻率不高所以并未
    發(fā)表于 01-23 11:21 ?679次閱讀

    kernel panic流程分析

    我們?cè)陧?xiàng)目開(kāi)發(fā)過(guò)程中,很多時(shí)候會(huì)出現(xiàn)由于某種原因經(jīng)常會(huì)導(dǎo)致手機(jī)系統(tǒng)死機(jī)重啟的情況(重啟分Android重啟跟kernel重啟,而我們這里只討論kernel重啟也就是 kernel panic
    的頭像 發(fā)表于 01-19 16:14 ?1528次閱讀
    <b class='flag-5'>kernel</b> <b class='flag-5'>panic</b>流程分析

    深入分析內(nèi)核panic的內(nèi)核錯(cuò)誤處理方案

    die函數(shù)主要執(zhí)行oops相關(guān)流程,且若異常為中斷流程中觸發(fā)或設(shè)置了panic_on_oops選項(xiàng),則進(jìn)一步通過(guò)panic將系統(tǒng)掛起。
    發(fā)表于 04-14 15:18 ?4424次閱讀

    嵌入式Linux上使用Ramoops的代碼應(yīng)用

    ramoops 還沒(méi)有配置完成,需要在 device tree里創(chuàng)建對(duì)應(yīng)的節(jié)點(diǎn)。在這之前先確定在內(nèi)存中可以為 ramoops 預(yù)留的地址空間。在 Linux 運(yùn)行下面命令。
    的頭像 發(fā)表于 12-06 11:18 ?1238次閱讀
    嵌入式Linux上使用<b class='flag-5'>Ramoops</b>的代碼應(yīng)用

    配網(wǎng)行波故障預(yù)警與定位裝置的故障定位精度等級(jí)劃分

    今天江蘇宇拓電力科技來(lái)為大家說(shuō)明一下配網(wǎng)行波故障預(yù)警與定位裝置的故障定位精度等級(jí)劃分。 摘要:隨著電力系統(tǒng)的不斷發(fā)展,配網(wǎng)行波故障預(yù)警與
    的頭像 發(fā)表于 12-22 15:02 ?3304次閱讀

    鴻蒙實(shí)戰(zhàn)開(kāi)發(fā)學(xué)習(xí)【FaultLoggerd組件】

    Faultloggerd部件是OpenHarmony中C/C++運(yùn)行時(shí)崩潰臨時(shí)日志的生成及管理模塊。面向基于 Rust 開(kāi)發(fā)的部件,F(xiàn)aultloggerd 提供了Rust Panic故障日志生成能力。系統(tǒng)開(kāi)發(fā)者可以在預(yù)設(shè)的路徑下找到
    的頭像 發(fā)表于 03-17 20:39 ?918次閱讀
    鴻蒙<b class='flag-5'>實(shí)戰(zhàn)</b>開(kāi)發(fā)學(xué)習(xí)【FaultLoggerd組件】