Как обнаружить панику ядра после перезагрузки

У меня неожиданная перезагрузка на встроенном устройстве. В настоящее время я могу обнаружить проблему с аппаратным сторожевым таймером благодаря вызову ioctl. Теперь я хотел бы определить, была ли причина перезагрузки причиной паники ядра. Я нахожу некоторые статьи, касающиеся crashkernel и crashdump, но я не смог заставить его работать должным образом. И я не хочу хранить журнал паники ядра. Просто будьте в состоянии знать, случается ли паника ядра.

Моя текущая идея заключалась в том, чтобы написать в зарезервированном месте на MMC. В настоящее время я использую зарезервированное пространство для обработки двойной системы распределения. Это хорошая идея? Можно ли написать в mmc во время паники ядра? Я не уверен, но кажется, что я могу использовать вид ядра паники, чтобы запустить процедуру на этом событии.

Не существует стандартного способа проверить, произошла ли паника ядра при загрузке?

1 ответ

Я смог обнаружить и отладить панику ядра благодаря комментарию @0andriy Как обнаружить панику ядра после перезагрузки

Включить ramoops в ядре defconfig:

+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

Вот как Windows справляется с этим:

  • больше не пользуйтесь драйверами
  • запись на диск с помощью подпрограмм BIOS (или что-то в этом роде низкого уровня)
  • записать дамп ядра в файл подкачки (единственное известное место, которое является смежным и известно, что мы можем писать, не повреждая ничего)
  • при следующей загрузке проверьте, содержит ли файл подкачки подпись аварийного дампа

Возможно, вы сможете применить эту концепцию к Linux, например, записать в раздел подкачки и проверить содержимое раздела подкачки при следующем запуске.

Другие вопросы по тегам