Linux内核检测看门狗的预引导环境

Linux kernel detecting the pre-boot environment for watchdog

因此,我正在为嵌入式Linux系统进行开发,我们在使用外部看门狗芯片时遇到了一些麻烦,该芯片需要在启动过程中尽早提供。

更具体地说,从我们可以确定的结果来看,当内核在预引导环境中解压缩其映像时,此外部监视程序将导致重置。开始馈送之前没有足够的停机时间,这可能应该是在硬件中排序的,因为它是外部的,但是需要内部软件解决方案。

我们的一位开发人员的解决方案是将一些额外的代码放入...中。

lib/zlib_inflate/inflate.c内核代码

中的

int zlib_inflate(z_streamp strm, int flush)

此新代码在解压缩期间会定期切换看门狗引脚。

现在除了我觉得这有点脏的事实之外。它确实有效,并且在我脑海中提出了一个有趣的观点。因为在启动后也会使用此库。那么,是否有一种不错的方法来检测一下您是否处于预引导环境中?因此,它只能执行此切换式预引导,而不能在以后使用lib时执行。

顺便说一句,我也对避免最初被黑客入侵的任何想法感兴趣。


So is there a nice way for a bit of code detecting whether you're in the pre-boot environment?

您正在询问XY问题。
如果您使用的是U-Boot,则可以彻底解决X问题的解决方案。
(顺便说一句,而不是" pre-boot ",即在引导之前,您的意思是" boot ",即在内核启动之前。)

如果在引导顺序中使用U-Boot,则不必破解任何引导或内核代码。显然,您是在zImage(或uImage中的zImage)文件中引导自解压压缩内核。无黑客的解决方案由U-Boot的作者/维护者Wolfgang Denk描述:

It is much better to use normal (uncompressed) kernel image, compress it
using just gzip, and use this as poayload for mkimage. This way
U-Boot does the uncompresiong instead of including yet another
uncompressor with each kernel image.

因此,代替简单的make,而不是make uImage
压缩映像文件,然后使用mkimage用U-Bootpackage器将其封装(并指定所应用的压缩算法,以便U-Boot可以使用其内置的解压缩器)来生成uImage文件。

当U-Boot加载此uImage文件时,package程序将指示它是压缩文件。
U-Boot将执行其内部解压缩程序库,该库(在最新版本中)已经监视。


快速而肮脏的解决方案浮出水面:

在已初始化为1的文件中创建一个全局静态变量,只要它为1,就认为它是" pre-boot "。

添加一个* _initcall(选择满足您需要的选项。我不确定何时对内核进行解压缩)以将其设置为0。

有关initcall级别,请参阅内核树中的include / linux / init.h。


另一个想法是,在系统完全启动后,从引导加载程序中禁用看门狗,并在用户空间中启用它。


有关@@ sawdust答案的答案,以了解如何在无需破解内核代码的情况下实现看门狗反馈。

但是,这并没有完全解决最初的问题,即如何在内核源代码中调用"预引导环境"中检测正在编译的代码。

内核中的文件,例如...

1
2
3
include/linux/decompress/mm.h

lib/decompress_inflate.c

在较小的程度上(没有清楚地评论)...

1
lib/decompress_unlzo.c

似乎要检查STATIC定义来设置"预启动环境"之间的差异。如摘录自include/linux/decompress/mm.h ...

1
2
3
4
5
6
7
8
9
10
11
12
13
#ifdef STATIC

/* Code active when included from pre-boot environment: */

...

#else /* STATIC */

/* Code active when compiled standalone for use when loading ramdisk: */

...

#endif /* STATIC */