Linux 内核正在检测看门狗的预引导环境
Linux kernel detecting the pre-boot environment for watchdog
所以我正在为嵌入式 Linux 系统开发,我们在使用外部看门狗芯片时遇到了一些问题,需要在启动过程的早期就给它供电。
更具体地说,据我们所知,当内核在预引导环境中解压缩其映像时,这个外部看门狗会导致重置。在开始需要进料之前没有足够的停机时间,这可能应该在硬件中分类,因为它是外部的,但需要一个内部软件解决方案。
我们的一位开发人员的解决方案是将一些额外的代码放入...
int zlib_inflate(z_streamp strm, int flush)
在lib/zlib_inflate/inflate.c
内核代码
这个新代码在解压期间周期性地切换看门狗引脚。
除了我觉得这有点肮脏的事实之外。它确实有效,并且在我脑海中提出了一个有趣的观点。因为这个库也是在启动后使用的。那么有没有一种好的方法可以让一些代码检测您是否处于预引导环境中?所以它只能执行这个切换预启动,而不是在以后使用 lib 时执行。
顺便说一句,我也对首先避免黑客攻击的任何想法感兴趣。
我头脑中快速而肮脏的解决方案:
在文件中做一个全局静态变量,初始化为1,只要是1,就认为"pre-boot".
添加一个*_initcall(自己选一个,内核什么时候解压不知道)设置为0。
请参阅内核树中的 include/linux/init.h 以了解 initcall 级别。
So is there a nice way for a bit of code detecting whether you're in the pre-boot environment?
你问的是 XY 问题。
X问题的解决方法如果你使用U-Boot就可以干净利落地解决
(顺便说一句,而不是“pre-boot”,即在启动之前,您可能是指 "boot",即在内核启动之前。)
如果您在启动顺序中使用 U-Boot,则无需破解任何启动或内核代码。显然,您正在 zImage(或 uImage 中的 zImage 中启动自解压压缩内核) 文件。 U-Boot 的 author/maintainer、Wolfgang Denk:
描述了无 hack-free 解决方案
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 uImage
,而是做一个简单的 make
。
压缩 Image 文件,然后使用 mkimage 使用 U-Boot 包装器封装它(并指定应用的压缩算法,以便 U- Boot 可以使用其内置的解压缩器) 生成您的 uImage 文件。
当 U-Boot 加载此 uImage 文件时,包装器将指示它是一个压缩文件。
U-Boot 将执行其内部解压缩器库,该库(在最近的版本中)已经支持看门狗。
查看@sawdust 的回答,了解如何在不破解内核代码的情况下实现看门狗喂养。
然而,这并没有完全解决原始问题,即如何检测 "pre-boot environment" 中正在编译的代码,因为它是在内核源代码中调用的。
内核中的文件,例如...
include/linux/decompress/mm.h
lib/decompress_inflate.c
并且在较小程度上(没有明确评论)...
lib/decompress_unlzo.c
似乎要检查 STATIC 定义以设置 "pre-boot environment" 差异。例如摘自 include/linux/decompress/mm.h
...
#ifdef STATIC
/* Code active when included from pre-boot environment: */
...
#else /* STATIC */
/* Code active when compiled standalone for use when loading ramdisk: */
...
#endif /* STATIC */
另一个想法是从引导加载程序禁用看门狗,并在系统完全启动后从用户 space 启用它。
所以我正在为嵌入式 Linux 系统开发,我们在使用外部看门狗芯片时遇到了一些问题,需要在启动过程的早期就给它供电。
更具体地说,据我们所知,当内核在预引导环境中解压缩其映像时,这个外部看门狗会导致重置。在开始需要进料之前没有足够的停机时间,这可能应该在硬件中分类,因为它是外部的,但需要一个内部软件解决方案。
我们的一位开发人员的解决方案是将一些额外的代码放入...
int zlib_inflate(z_streamp strm, int flush)
在lib/zlib_inflate/inflate.c
内核代码
这个新代码在解压期间周期性地切换看门狗引脚。
除了我觉得这有点肮脏的事实之外。它确实有效,并且在我脑海中提出了一个有趣的观点。因为这个库也是在启动后使用的。那么有没有一种好的方法可以让一些代码检测您是否处于预引导环境中?所以它只能执行这个切换预启动,而不是在以后使用 lib 时执行。
顺便说一句,我也对首先避免黑客攻击的任何想法感兴趣。
我头脑中快速而肮脏的解决方案:
在文件中做一个全局静态变量,初始化为1,只要是1,就认为"pre-boot".
添加一个*_initcall(自己选一个,内核什么时候解压不知道)设置为0。
请参阅内核树中的 include/linux/init.h 以了解 initcall 级别。
So is there a nice way for a bit of code detecting whether you're in the pre-boot environment?
你问的是 XY 问题。
X问题的解决方法如果你使用U-Boot就可以干净利落地解决
(顺便说一句,而不是“pre-boot”,即在启动之前,您可能是指 "boot",即在内核启动之前。)
如果您在启动顺序中使用 U-Boot,则无需破解任何启动或内核代码。显然,您正在 zImage(或 uImage 中的 zImage 中启动自解压压缩内核) 文件。 U-Boot 的 author/maintainer、Wolfgang Denk:
描述了无 hack-free 解决方案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 uImage
,而是做一个简单的 make
。
压缩 Image 文件,然后使用 mkimage 使用 U-Boot 包装器封装它(并指定应用的压缩算法,以便 U- Boot 可以使用其内置的解压缩器) 生成您的 uImage 文件。
当 U-Boot 加载此 uImage 文件时,包装器将指示它是一个压缩文件。
U-Boot 将执行其内部解压缩器库,该库(在最近的版本中)已经支持看门狗。
查看@sawdust 的回答,了解如何在不破解内核代码的情况下实现看门狗喂养。
然而,这并没有完全解决原始问题,即如何检测 "pre-boot environment" 中正在编译的代码,因为它是在内核源代码中调用的。
内核中的文件,例如...
include/linux/decompress/mm.h
lib/decompress_inflate.c
并且在较小程度上(没有明确评论)...
lib/decompress_unlzo.c
似乎要检查 STATIC 定义以设置 "pre-boot environment" 差异。例如摘自 include/linux/decompress/mm.h
...
#ifdef STATIC
/* Code active when included from pre-boot environment: */
...
#else /* STATIC */
/* Code active when compiled standalone for use when loading ramdisk: */
...
#endif /* STATIC */
另一个想法是从引导加载程序禁用看门狗,并在系统完全启动后从用户 space 启用它。