Mips Linux:将内核恐慌记录到mtd分区

时间:2014-11-24 14:53:43

标签: linux kernel mips32 panic

我们正在为基于MIPS的嵌入式设备在现场遇到内核恐慌。如何在MTD分区中记录内核崩溃跟踪?我们是否必须仅将跟踪写入MTD,或者是否可以通过NFS进行写入?任何人都可以解释如何在远程盒子发生恐慌后获得有用的内核跟踪。

2 个答案:

答案 0 :(得分:4)

您可以在内核中打开mtdoops模块,并将内核恐慌跟踪记录到mtd分区。我认为我们不能通过NFS编写恐慌跟踪。但是,您可能想要探索ramoops。

以下是配置内核以捕获内核oops到mtd flash的步骤。在内核崩溃之后捕获堆栈跟踪对于调试内核问题(尤其是在现场发生的问题)非常有用。在mtdoops模块初始化期间,mtd分区变为循环缓冲区并预先擦除。

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

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

  2. --- ./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 / oops

    除了启用MTP OOPS标志外,还要配置CONFIG_MAGIC_SYSRQ以引发混乱并测试此功能。

    1. 现在,我们需要创建一个MTD分区(/ dev / Oops)来存储恐慌痕迹。可以通过修改 arch ///。c 中内核源中定义的内存布局和分区信息来对MTD进行分区。此外,您需要注意作为内核命令行的一部分传递的分区信息将覆盖 board.c 更改。
    2. {
      .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
      },
      
      1. 构建内核,mtdoops.ko将作为根文件系统的一部分构建。安装文件系统并确保创建分区。
      2. cat /proc/mtd
        dev: size erasesize name
        mtd0: 000e0000 00020000 "loader"
        mtd1: 002a0000 00020000 "kernel"
        mtd3: 000e0000 00020000 "Oops"
        mtd5: 08000000 00020000 "all"
        
        1. 现在,使用Magic SysRq键触发恐慌并观察Oops分区中的内核恐慌日志。

答案 1 :(得分:0)

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