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

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

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

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

要長高 ? 來源:Toradex胡珊逢 ? 作者:Toradex胡珊逢 ? 2023-12-06 11:18 ? 次閱讀

By Toradex胡珊逢

對于嵌入式設(shè)備,盡管在部署前會經(jīng)歷大量的測試和驗證,但在使用現(xiàn)場有時候仍不可避免會出現(xiàn)意外情況,如Kernel opps、panic。當(dāng)出現(xiàn)類似情況時,系統(tǒng)日志往往無法及時寫入flash,重啟后不能獲得用于分析問題的關(guān)鍵信息Ramoops可以應(yīng)對此類問題。當(dāng)發(fā)發(fā)生Kernel opps、panic時,它能夠?qū)⑾嚓P(guān)日志保存到特定的內(nèi)存區(qū)域,并在軟重啟后仍可以讀取。文章將使用安裝Linux BSP v3.0的Apalis iMX6計算機模塊進行說明。

首先使用Toradex Easy Installer安裝Linux BSP v3.0。然后下載對應(yīng)的Linux源碼,分支為toradex_4.14-2.3.x-imx。交叉編譯工具是gcc-arm-8.2-2019.01-x86_64-arm-linux-gnueabihf。

應(yīng)用Apalis iMX6默認內(nèi)核配置。

-----------------------------------------

$make apalis_imx6_defconfig

-----------------------------------------

開啟ramoops功能。

-----------------------------------------

$make menuconfig

File systems → Miscellaneous filesystems

<*> Persistent store support

Choose compression algorithm (ZLIB) --->

[*] Log kernel console messages

[*] Log user space messages

<*> Log panic/oops to a RAM buffer

-----------------------------------------

1663918814169006.png

為了便于觸發(fā)kernel panic開啟sysrq功能。

-----------------------------------------

Kernel hacking

[*] Magic SysRq key

0x1) Enable magic SysRq key functions by default

[*] Enable magic SysRq key over serial

-----------------------------------------

1663918818305171.png

最后重新編譯內(nèi)核以及內(nèi)核模塊。

-----------------------------------------

$ make zImage LOADADDR=10008000

$ make modules

-----------------------------------------

使用新的內(nèi)核和模塊重新啟動Apalis iMX6。Ramoops在內(nèi)核配置里又稱為PSTORE,使用下面命令查看之前的內(nèi)核內(nèi)置是否生效。

-----------------------------------------

root@apalis-imx6:~# zcat /proc/config.gz |grep PSTORE

CONFIG_PSTORE=y

CONFIG_PSTORE_ZLIB_COMPRESS=y

# CONFIG_PSTORE_LZO_COMPRESS is not set

# CONFIG_PSTORE_LZ4_COMPRESS is not set

CONFIG_PSTORE_CONSOLE=y

CONFIG_PSTORE_PMSG=y

CONFIG_PSTORE_RAM=y

root@apalis-imx6:~# zcat /proc/config.gz |grep SYSRQ

CONFIG_MAGIC_SYSRQ=y

CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1

CONFIG_MAGIC_SYSRQ_SERIAL=y

-----------------------------------------

此時,ramoops還沒有配置完成,需要在device tree里創(chuàng)建對應(yīng)的節(jié)點。在這之前先確定在內(nèi)存中可以為ramoops預(yù)留的地址空間。在Linux運行下面命令。

-----------------------------------------

root@apalis-imx6:~# cat /proc/iomem

00100000-00103fff : /soc/caam-sm@00100000

00120000-00128fff : 120000.hdmi_core

00130000-00133fff : galcore register region

……

02204000-02207fff : galcore register region

02400000-027fffff : 2400000.ipu

02800000-02bfffff : 2800000.ipu

10000000-4fffffff : System RAM

10008000-10cfffff : Kernel code

10e00000-10eeb3cf : Kernel data

-----------------------------------------

RAM的物理地址空間為0x10000000-0x4fffffff,選擇在Kernel code和Kernel data之外的0x30000000作為ramoops的起始地址,大小為1MB。

在arch/arm/boot/dts/imx6q.dtsi的reserved-memory 節(jié)點里添加ramoops。

1663918824691664.png

重新編譯device tree。

-----------------------------------------

$make imx6q-apalis-eval.dtb

-----------------------------------------

使用新的device tree啟動后,可以看到以下信息。

-----------------------------------------

root@apalis-imx6:~# dmesg|grep ramoops

[ 0.071682] pstore: Registered ramoops as persistent store backend

[ 0.071707] ramoops: attached 0x100000@0x30000000, ecc: 0/0

-----------------------------------------

下面命令分別設(shè)置系統(tǒng)在發(fā)生kernel panic時1秒后自動重啟,以及觸發(fā)kernel panic。

-----------------------------------------

root@apalis-imx6:~# echo 1 > /proc/sys/kernel/panic

root@apalis-imx6:~# echo c > /proc/sysrq-trigger

-----------------------------------------

在自動重啟后,將ramoops掛載到/home/root/pstore目錄,可以看到上次發(fā)生kerne panic時的日志。

-----------------------------------------

root@apalis-imx6:~# mkdir -p /home/root/pstore

root@apalis-imx6:~# mount -t pstore psotre /home/root/pstore

root@apalis-imx6:~# ls pstore/

console-ramoops-0 dmesg-ramoops-0 dmesg-ramoops-1

root@apalis-imx6:~/pstore# tail -n 5 console-ramoops-0

[ 856.337055] ffa0: 00be5898 00000000 00000020 76ed4bb4

[ 856.345259] ffc0: 00be5898 00000020 00000002 00000001 76ed71c0 00be6828 00000001 7ed702e0

[ 856.353460] ffe0: 00000000 7ed70138 76dd382d 76d88cd0 000f0010 ffffffff

[ 856.360101] r9:00be6828 r8:10c5387d r7:10c5387d r6:ffffffff r5:000f0010 r4:76d88cd0

[ 856.385215] Rebooting in 1 seconds..

root@apalis-imx6:~/pstore# tail -n 5 dmesg-ramoops-0

<4>[ 856.200454] r9:00000000 r8:00000000 r7:00000002 r6:00d00440 r5:a909bf00 r4:a909bf00

<4>[ 856.208233] [<80227be8>] (SyS_write) from [<80107d20>] (ret_fast_syscall+0x0/0x54)

<4>[ 856.215828] r9:a975a000 r8:80107f24 r7:00000004 r6:76f5bda0 r5:00d00440 r4:0000006c

<0>[ 856.223594] Code: e5834000 f57ff04e ebf07aaa e3a03000 (e5c34000)

<4>[ 856.229847] ---[ end trace 583cc693cbfd2cb1 ]---

-----------------------------------------

由于ramoops是將日志保存在內(nèi)存里,如果模塊是冷啟動,即電源復(fù)位,那么相關(guān)的內(nèi)容也不再保留。

-----------------------------------------

root@apalis-imx6:~# mount -t pstore psotre /home/root/pstore

root@apalis-imx6:~# ls pstore/

root@apalis-imx6:~#

-----------------------------------------

參考

https://git.toradex.cn/cgit/linux-toradex.git/tree/Documentation/admin-guide/ramoops.rst?h=toradex_4.14-2.3.x-imx

https://lwn.net/Articles/501748/

總結(jié)

ramoops可以使用較小的開銷記錄系統(tǒng)日志一般難以保存的kernel panic錯誤。由于存儲于內(nèi)存里面,因此在掉電后這些信息就不復(fù)存在。在Linux中還有許多其他的調(diào)試方法,如kdb, kdump, tracing等,它們的使用特點和復(fù)雜程度也各有不同,用戶可以根據(jù)需求加以選擇。

審核編輯:黃飛

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

    關(guān)注

    87

    文章

    11215

    瀏覽量

    208740
  • 計算機
    +關(guān)注

    關(guān)注

    19

    文章

    7383

    瀏覽量

    87641
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2982

    瀏覽量

    73826
  • 嵌入式設(shè)備
    +關(guān)注

    關(guān)注

    0

    文章

    110

    瀏覽量

    16925
收藏 人收藏

    評論

    相關(guān)推薦

    什么是嵌入式Linux

    Linux操作系統(tǒng)。嵌入式Linux既繼承了intelnet無限的開放原代碼資源,又具有嵌入式
    發(fā)表于 01-23 11:59

    PXA255嵌入式Linux應(yīng)用平臺說明

    PXA255嵌入式Linux應(yīng)用平臺說明
    發(fā)表于 03-28 09:52 ?28次下載

    嵌入式Linux

    嵌入式Linux隨著Linux的迅速發(fā)展,嵌入式Linux現(xiàn)在已經(jīng)有許多的版本,包括強實時的嵌入式
    發(fā)表于 06-17 00:36 ?915次閱讀

    嵌入式Linux嵌入式Linux開發(fā)環(huán)境詳解

    嵌入式linux 是將日益流行的Linux操作系統(tǒng)進行裁剪修改使之能在嵌入式計算機系統(tǒng)運行的一種操作系統(tǒng)
    發(fā)表于 06-15 18:18 ?135次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>和<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>開發(fā)環(huán)境詳解

    嵌入式LINUX開發(fā)基礎(chǔ)知識

    嵌入式LINUX簡介,嵌入式LINUX開發(fā)平臺簡介,嵌入式LINUX開發(fā)流程,建立
    發(fā)表于 07-31 21:34 ?261次下載

    嵌入式Linux學(xué)習(xí)入門七步曲

    嵌入式linux 是將日益流行的Linux操作系統(tǒng)進行裁剪修改,使之能在嵌入式計算機系統(tǒng)運行的一種操作系統(tǒng)。
    發(fā)表于 09-13 11:04 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>學(xué)習(xí)入門七步曲

    嵌入式linux學(xué)習(xí)誤區(qū)

    代碼,花了大量時間去閱讀《linux源碼深度分析》、《linux情景分析等》等書。這樣的結(jié)果很可能就是看的頭昏眼花,不知所云,最后只能放棄了。這也是同學(xué)們學(xué)習(xí)嵌入式
    發(fā)表于 08-30 17:04 ?470次閱讀

    什么是嵌入式Linux嵌入式工程師為什么要學(xué)Linux?

    Linux操作系統(tǒng)。嵌入式Linux既繼承了intelnet無限的開放原代碼資源,又具有嵌入式
    發(fā)表于 10-20 14:51 ?3次下載
    什么是<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>?<b class='flag-5'>嵌入式</b>工程師為什么要學(xué)<b class='flag-5'>Linux</b>?

    嵌入式Linux UART

    文章目錄前言串口連接串口測試C代碼微信公眾號前言這是前篇:嵌入式Linux i.MX開發(fā)板嵌入式Linux NFS
    發(fā)表于 11-01 16:26 ?8次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b> UART

    嵌入式Linux開發(fā)環(huán)境部署

    系統(tǒng)用于編譯嵌入式內(nèi)核及應(yīng)用代碼。1.adb工具部署于windows。用于訪問嵌入式linux系統(tǒng),上傳下載文件。常用的命令有:adb s
    發(fā)表于 11-01 17:22 ?13次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>開發(fā)環(huán)境部署

    嵌入式Linux(基礎(chǔ)篇)】從標準Linux嵌入式Linux + 嵌入式Linux知識架構(gòu)

    主要介紹了GNU/Linux的誕生,標準Linux是如何應(yīng)用在嵌入式系統(tǒng)中的,最后講述了嵌入式Linux知識架構(gòu)。
    發(fā)表于 11-02 09:51 ?34次下載
    【<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>(基礎(chǔ)篇)】從標準<b class='flag-5'>Linux</b>到<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b> + <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>知識架構(gòu)

    嵌入式Linux

    嵌入式 Linux嵌入式操作系統(tǒng)的一個新成員,其最大的特點是源代碼公開并且遵循GPL協(xié)議,近幾年來已成為研究熱點。目前正在開發(fā)的嵌入式系統(tǒng)
    發(fā)表于 11-02 10:06 ?14次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>

    嵌入式Linux network

    文章目錄前言網(wǎng)絡(luò)通信簡介服務(wù)器程序客戶端程序運行微信公眾號前言這是前篇:嵌入式Linux i.MX開發(fā)板嵌入式Linux NFS嵌入式
    發(fā)表于 11-02 10:51 ?15次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b> network

    嵌入式Linux路線

    嵌入式linux開發(fā)環(huán)境搭建、嵌入式linux開發(fā)模型、linux內(nèi)核移植和文件系統(tǒng)、嵌入式
    發(fā)表于 11-02 11:51 ?18次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>路線

    嵌入式Linux培訓(xùn)開發(fā)

    Linux SourceCode(源代碼)均可免費取得。 隨著 Linux 在國內(nèi)的日益普及,企業(yè)對 Linux 人才的需求也會持續(xù)升溫,并且表現(xiàn)在層次
    發(fā)表于 11-02 14:05 ?13次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>培訓(xùn)開發(fā)