前言:
對于嵌入式產品的開發使用,盡管會經歷大量的測試和驗證,但在大批量生產中,硬件物料的適配一致性,應用軟件的異常消息隊列等因素,使得現場使用中存在極小概率發生意外狀況,出現如 kernel opps、panic等死機現象。這時系統日志無法及時寫入 flash,重啟后沒有存到任何關鍵信息,工程師也崩潰了。下文則基于眺望電子T113-i核心板產品為例,介紹如何在Linux系統上搭建并驗證ramoops, 以便在系統崩潰或異常時進行故障排查。
一、ramoops 簡介
ramoops 是一個 oops/panic 日志記錄器,它在系統崩潰之前將其日志寫入 RAM。它的工作原理是將 oops 和 panic 記錄在循環緩沖區中。ramoops 需要具有持久 RAM 的系統,以便該區域的內容在重啟后仍然存在。
二、ramoops 搭建
2.1環境說明
平臺: T113-I Tina
SDK : talowe-T113-I-Tina-sdk_2025_03_10.tar.gz
Kernel 版本: 5.4.61
查看系統內存
[root@T113-I:/]# cat /proc/iomem
可以看到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
[root@T113-I:/]# cat /proc/iomem
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)
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)
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)
既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)
既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)
既16K
2.3.7 查看是否開啟ecc糾錯(ecc)
[root@T113-I:/]# cat /sys/module/ramoops/parameters/ecc
0:未開啟
非0:開啟,使用該值的字節進行糾錯
2.3.8 查看存儲哪些的內核信息類型(dump_oops)
[root@T113-I:/]# cat /sys/module/ramoops/parameters/dump_oops
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
重啟后,掛載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行
如下圖,可以看到前面的系統時間與內容和崩潰時打印的一模一樣,同時前面多了日志等級標記
同時,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
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
四、小結
以上則是基于ramoops在全志T113-i平臺上的簡單使用技巧,若您也有linux系統方面的問題或想了解更多相關技術知識或產品信息,請關注眺望電子公眾號并聯系我們,我們將竭誠為您服務!
-
嵌入式
+關注
關注
5142文章
19561瀏覽量
315418 -
故障定位
+關注
關注
0文章
145瀏覽量
9741 -
Kernel
+關注
關注
0文章
49瀏覽量
11562
發布評論請先 登錄
鴻蒙實戰開發:【FaultLoggerd組件】講解

掛載文件系統出現"kernel panic..." 史上最全解決方案
kernel移植報錯
Kernel panic - not syncing: No init found
配置nfs啟動出現kernel panic
分享幾種RK3399開啟ramoops查看kernel log的方法
nuc980不管如何都是開不起來kernel panic是怎么回事?
Linux Kernel Panic的產生的原因?
筆記本啟動故障修復實戰
kernel panic流程分析

深入分析內核panic的內核錯誤處理方案
嵌入式Linux上使用Ramoops的代碼應用

配網行波故障預警與定位裝置的故障定位精度等級劃分
鴻蒙實戰開發學習【FaultLoggerd組件】

評論