重启后如何检测内核崩溃

问题描述 投票:1回答:2

我在嵌入式设备上有一些意外的重启。由于ioctl调用,我目前能够检测到硬件看门狗问题。现在我希望能够检测内核崩溃是否是重启的原因。我找到一些关于crashkernel和crashdump的文章,但我无法让它正常工作。而且我不想存储内核恐慌日志。能够知道内核恐慌是否发生。

我目前的想法是写在mmc上的预留空间。我目前正在使用预留空间来处理双重分配系统。这是个好主意?在内核恐慌期间是否可以用mmc写?我不确定,但似乎我可以使用一种内核恐慌钩来运行此事件的例程。

有没有标准的方法可以检查启动时发生的内核恐慌?

linux-kernel embedded coredump panic
2个回答
0
投票

以下是Windows处理它的方式:

  • 不要再使用司机了
  • 使用BIOS例程写入磁盘(或者这样的低级别)
  • 将内核转储写入页面文件(唯一已知的连续且已知的位置,我们可以写入而不会损坏任何内容)
  • 在下次启动时,检查页面文件是否包含崩溃转储签名

您可以将此概念应用于Linux,例如写入交换分区并在下次启动时检查交换分区的内容。


0
投票

由于@ 0andriy How to detect a kernel panic after reboot的评论,我能够检测并调试内核恐慌

在内核defconfig中启用ramoops:

+CONFIG_PSTORE=y
+CONFIG_PSTORE_ZLIB_COMPRESS=y
+CONFIG_PSTORE_CONSOLE=y
+CONFIG_PSTORE_RAM=y

在你的内核板init中添加代码来声明ramoops内存空间,你也可以使用设备树甚至在内核procline中使用一个参数这是一个使用代码方法的例子,在我的用例中它是在arch / arm / mach-中IMX /马赫 - imx6ul.c

--- a/arch/arm/mach-imx/mach-imx6ul.c
+++ b/arch/arm/mach-imx/mach-imx6ul.c
@@ -21,6 +21,24 @@
 #include "cpuidle.h"
 #include "hardware.h"

+#include <linux/pstore_ram.h>
+#include <linux/memblock.h>
+
+static struct ramoops_platform_data ramoops_data = {
+       .mem_address = 0xXXXXXXXX, // Depending of the hardware
+       .mem_size = 0x00005000, // 5 Mb
+       .record_size = 0x00002000, // 1 Mb
+       .dump_oops = 1,
+};
+
+static struct platform_device ramoops_dev = {
+       .name = "ramoops",
+       .dev = {
+               .platform_data = &ramoops_data,
+       },
+};
+
+
 static void __init imx6ul_enet_clk_init(void)
 {
        struct regmap *gpr;
@@ -170,6 +188,14 @@ static inline void imx6ul_enet_init(void)
 static void __init imx6ul_init_machine(void)
 {
        struct device *parent;
+       int ret;
+
+       ret = platform_device_register(&ramoops_dev);
+       if (ret) {
+               printk(KERN_ERR "unable to register platform device\n");
+               return;
+       }
+       memblock_reserve(ramoops_data.mem_address, ramoops_data.mem_size);

        parent = imx_soc_device_init();
        if (parent == NULL)

然后在启动时我只需检查ramoops的内容以检查是否有可用的内核恐慌日志。我可以使用以下命令挂载ramoops内存空间:

mount -t pstore -o kmsg_bytes=1000 - /sys/fs/pstore
© www.soinside.com 2019 - 2024. All rights reserved.