Linux kernel detecting the pre-boot environment for watchdog
因此,我正在为嵌入式Linux系统进行开发,我们在使用外部看门狗芯片时遇到了一些麻烦,该芯片需要在启动过程中尽早提供。
更具体地说,从我们可以确定的结果来看,当内核在预引导环境中解压缩其映像时,此外部监视程序将导致重置。开始馈送之前没有足够的停机时间,这可能应该是在硬件中排序的,因为它是外部的,但是需要内部软件解决方案。
我们的一位开发人员的解决方案是将一些额外的代码放入...中。
中的
此新代码在解压缩期间会定期切换看门狗引脚。
现在除了我觉得这有点脏的事实之外。它确实有效,并且在我脑海中提出了一个有趣的观点。因为在启动后也会使用此库。那么,是否有一种不错的方法来检测一下您是否处于预引导环境中?因此,它只能执行此切换式预引导,而不能在以后使用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.
因此,代替简单的
压缩映像文件,然后使用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定义来设置"预启动环境"之间的差异。如摘录自
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 */ |