《嵌入式Linux上使用Ramoops的代码应用.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux上使用Ramoops的代码应用.docx(5页珍藏版)》请在第一文库网上搜索。
1、嵌入式1inux上使用Ramoops的代码应用目录1 .前言12 .嵌入式1inux上使用Ramoops的代码应用1?参考5?总结61 .前言对于嵌入式设备,尽管在部署前会经历大量的测试和验证,但在使用现场有时候仍不可避免会出现意外情况,如Kerne1oppspanico当出现类似情况时,系统日志往往无法及时写入f1ash,重启后不能获得用于分析问题的关键信息。RamOOPS可以应对此类问题。当发发生Kerne1Opps、PaniC时,它能够将相关日志保存到特定的内存区域,并在软重启后仍可以读取。文章将使用安装1inUXBSPv3.0的Apa1isiMX6计算机模块进行说明。2 .嵌入式1in
2、UX上使用Ramoops的代码应用首先使用ToradexEasyInStaI1er安装1inUXBSPv3.0。然后下载对应的1inux源码,分支为toradex_4.14-2.3.x-imxo交叉编译工具是gcc-arm-8.2-2019.01-x86_64-arm-1inux-gnueabihfo应用Apa1isiMX6默认内核配置。$makeapa1is_imx6_defconfig开启ramoops功能。$makemenuconfigFi1esystemsMisce11aneousfi1esystemsPersistentstoresupportChoosecompressiona1g
3、orithm(Z11B)*1ogkerne1conso1emessages*1oguserspacemessages1ogpanic/oopstoaRAMbufferROMfi1esystemsupportPersistentstoresuChooseConpresstona1gortth(Z1IB),*1ogkerne1conso1emessages*1oguserspacemessages1ogpantcpstoaRAMbufferSysteRVXetxV7Coheretfi1esystePPAdUFSfi1esystemsupport(readon1y)为了便于触发kerne1panic
4、开启sysrq功能。Kerne1hacking*MagicSysRqkeyOx1Enab1emagicSysRqkeyfunctionsbydefau1t*Enab1emagicSysRqkeyoverseria1Pr1ntkanddresgoptionsCgPtIe-tinechecksandCOnP11eroptions*MagtcSysRqkey(x1)Enab1enagtcSysRqkeyfunctionsbydefau1t*Enab1eP1agiCSysRqkeyoverseria1Kerne1debuggingMemoryDebugging最后重新辐内应以友丙孩模轨。$makez1
5、mage1OADADDR=10008000$makemodu1es使用新的内核和模块重新启动Apa1isiMX6oRamoops在内核配置里又称为PSTORE,使用下面命令查看之前的内核内置是否生效。rootapa1is-imx6:#zcatprocconfig.gzgrepPSTORECONFIG_PSTORE=yCONFIG_PSTORE_Z1IB_COMPRESS=y# CONFIG_PSTORE_1ZO_COMPRESSisnotset# C0NFIG_PST0RE_1Z4_C0MPRESSisnotsetCONFIG_PSTORE_CONSO1E=yCONFIG_PSTORE_PMS
6、G=yCONFIG_PSTORE_RAM=yrootapa1is-imx6:-#zcatprocconfig.gzgrepSYSRQCONFIG_MAGIC_SYSRQ=yCONFIG_MAGIC_SYSRQ_DEFAU1T_ENAB1E=Ox1CONFIG_MAGIC_SYSRQ_SERIA1=y此时,ramoops还没有配置完成,需要在devicetree里创建对应的节点。在这之前先确定在内存中可以为ramoops预留的地址空间。在1inux运行下面命令。rootapa1is-imx6:#catprociomem00100000-00103fff:/soc/caam-sm001000000
7、0120000-00128fff:120000.hdmi_core00130000-00133fff:ga1coreregisterregion02204000-02207fff:ga1coreregisterregion02400000-027fffff:2400000.ipu02800000-02bfffff:2800000.ipu10000000-4fffffff:SystemRAM10008000-10cfffff:Kerne1code10e00000-10eeb3cf:Kerne1dataRAM的物理地址空间为0x10000000-0x4fffffff,选择在Kerne1code和K
8、erne1data之外的0x30000000作为ramoops的起始地址,大小为1MB。在archarmbootdtsimx6q.dtsi的reserved-memory节点里添力口ramoopsoreserved-menoryfaddress-ce11s-;Wsize-Ce11s=;ranges;11nux,cacompatib1e-*shareddma-poo1;reusab1e;size-;1inu4caa-defauIt;Jramps3Oe(compatib1e*ramoops*;reg-;record-size=;conso1e-size-;psg-size=:份电子发疑反ujuw.
9、1cfa重新编译devicetreeo$makeimx6q-apa1is-eva1.dtb使用新的devicetree启动后,可以看到以下信息。rootapa1is-imx6:#dmesggrepramoops0.071682pstore:Registeredramoopsaspersistentstorebackend0.071707ramoops:attachedOX1OOoOO0x30000000,ecc:0/0下面命令分别设置系统在发生kerne1panic时1秒后自动重启,以及触发kerne1panicorootapa1is-imx6:#echo1/proc/sys/kerne1/p
10、anicrootapa1is-imx6:#echocprocsysrq-trigger在自动重启后,将ramoops挂载至JhomerootPStore目录,可以看到上次发生kernepanic时的日志。rootapa1is-imx6:#mkdir-p/home/root/pstorerootapa1is-imx6:#mount-tpstorepsotre/home/root/pstorerootapa1is-imx6:#Ispstore/conso1e-ramoops-0dmesg-ramoops-0dmesg-ramoops-1rootapa1is-imx6:/pstore#tai1-n5
11、conso1e-ramoops-0856.337055ffa:00be5898000000000000002076ed4bb4856.345259ffc:00be589800000020000000020000000176ed71c000be6828000000017ed702e0856.353460ffe:000000007ed7013876dd382d76d88cd0OOOfOO1Offffffff856.360101r9:00be6828r8:10c5387dr7:10c5387dr6:ffffffffr5:000f0010r4:76d88cd0856.385215Rebootingin
12、1seconds.rootapa1is-imx6:/pstore#tai1-n5dmesg-ramoops-0856.200454r9:00000000r8:00000000r7:00000002r6:00d00440r5:a909bf00r4:a909bf00856.208233SyS_writefrom(ret_fast_sysca11+0x0/0x54856.215828r9:a975a000r8:80107f24r7:00000004r6:76f5bda0r5:00d00440r4:0000006c856.223594Code:e5834000f57ff04eebf07aaae3a03
13、000(e5c34000)856.229847endtrace583cc693cbfd2cb1由于ramoops是将日志保存在内存里,如果模块是冷启动,即电源复位,那么相关的内容也不再保留。rootapa1is-imx6:-#mount-tpstorepsotrehomerootpstorerootapa1is-imx6:#Ispstore/rootapa1is-imx6:#?.参考?.总结ramoops可以使用较小的开销记录系统日志一般难以保存的kerne1panic错误。由于存储于内存里面,因此在掉电后这些信息就不复存在。在1inUX中还有许多其他的调试方法,如kdb,kdump,tracing等,它们的使用特点和复杂程度也各有不同,用户可以根据需求加以选择。