2014-11-24 197 views
2

我们在基于MIPS的嵌入式设备领域遇到了内核恐慌。如何在MTD分区中记录内核恐慌痕迹?我们是否必须将跟踪写入MTD,还是可以写入NFS?任何人都可以解释如何在远程盒子的恐慌之后获得有用的内核痕迹。Mips Linux:将内核恐慌记录到mtd分区中

回答

3

您可以打开内核中的mtdoops模块并将内核恐慌记录记录到mtd分区上。我不认为我们可以通过NFS编写恐慌追踪。不过,你可能想探索一下ramoops。

以下是配置内核捕获内核oops到mtd闪存的步骤。在内核恐慌之后捕获堆栈跟踪对于调试内核问题特别是在现场发生的问题是无价的。在mtdoops模块初始化过程中,mtd分区会变成循环缓冲区并被预先擦除。

  1. 内核标志,CONFIG_MTD_OOPS,配置内核写哎呀堆栈跟踪到MTD分区。这个MTD dev分区信息可以在mtdoops模块内进行硬编码,也可以动态指定。该组件可以作为内核的一部分或作为单独的模块构建。在构建内核之前,您需要确保您的mtd设备已经注册了panic_write处理程序。记住,正常的mtd写入处理程序是不够的,因为在内核恐慌之后我们必须写入mtd内存。如果mtd设备没有自己的恐慌写入处理程序,请运行this修补程序。

    当作为内核的一部分构建时,CONFIG_MTD_OOPS = y,mtdoops模块需要使用闪存分区信息(mtddev)进行修补。

--- ./drivers/mtd/mtdoops.c.orig 2014-11-17 12:06:59.000000000 +0000 
+++ ./drivers/mtd/mtdoops.c 2014-11-17 12:07:36.000000000 +0000 
@@ -44,7 +44,7 @@ 
MODULE_PARM_DESC(record_size, 
"record size for MTD OOPS pages in bytes (default 4096)"); 

-static char mtddev[80]; 
+static char mtddev[80]="/dev/oops"; 
module_param_string(mtddev, mtddev, 80, 0400); 
MODULE_PARM_DESC(mtddev, 
"name or index number of the MTD device to use"); 

虽然构建它作为模块,CONFIG_MTD_OOPS = m,则闪存分区信息模块安装(insmod的)期间动态地提供。

insmod的mtdoops.ko mtddev =的/ dev /糟糕

除了使MTP OOPS标志,别配置,CONFIG_MAGIC_SYSRQ,以诱导恐慌和测试这个功能。

  1. 现在,我们需要创建一个MTD分区(/ dev/Oops)来存储恐慌痕迹。可以通过修改内核源代码中定义的内存布局和分区信息来对MTD进行分区,其格式为arch ///。c。另外,您需要注意,作为内核命令行一部分传递的分区信息将会覆盖board.c更改。
{ 
.name = "loader", 
.size = 0x000E0000, 
.offset = MTDPART_OFS_APPEND 
}, 
{ 
.name = "kernel", 
.size = 0x002A0000, 
.offset = MTDPART_OFS_APPEND 
}, 
{ 
.name = "oops", 
.size = 0x000E0000, 
.offset = MTDPART_OFS_APPEND 
}, 
{ 
.name = "all", 
.size = MTDPART_SIZ_FULL, 
.offset = 0x00000000 
}, 
  • 生成内核和mtdoops.ko将得到构建为根文件系统的一部分。安装文件系统并确保分区已创建。
  • cat /proc/mtd 
    dev: size erasesize name 
    mtd0: 000e0000 00020000 "loader" 
    mtd1: 002a0000 00020000 "kernel" 
    mtd3: 000e0000 00020000 "Oops" 
    mtd5: 08000000 00020000 "all" 
    
  • 现在,触发使用魔术键恐慌和在糟糕分区观察内核恐慌日志。
  • 0

    非常感谢您的详细步骤。一切似乎都很好,除了设备名称。当我将设备名称设置为“/ dev/oops”时,mtdoops未连接到引导消息中的任何设备。经过一定程度的调试后,我发现设备名称应该只是“oops”或“分区号”,即(如果你的oops分区是mtd9,只需给出“9”作为分区号)。改变它后,它开始工作。我能够使用sp-oops-extract查看日志。