0

我的板上有 3 MB 的 SPI 闪存,我可以将 bzImage、busybox initrd 和 coreboot ROM 打包到这个 SPI 闪存中。我还能够启动到 shell,全部使用 ROM kernel-as-bootloader。

我在 USB 设备上有更大的内核。我还能够检测到 USB 并安装它。但问题是busybox 似乎没有kexec 实用程序。我不能使用任何其他 initrd 包,因为由于内存限制,我的 cpio(未压缩)大小不应超过 1.4 MB。U-root具有 kexec 支持,但最小图像大小很容易达到 3MB,或者至少,我找不到构建小于该大小的方法。

因此,有没有办法将 kexec 支持添加到busybox(编译静态二进制文件并复制到 initrd?)或任何其他可以满足 1.4MB 大小需求的 initrd 包?

编辑

这篇文章表明busybox中可能有kexec支持,但我找不到它的任何痕迹。事实上,将 kexec-tools 添加到busybox 的请求是在十多年前完成的。但是当我在busybox中执行grep时,我没有看到它的痕迹。

4

1 回答 1

2

kexec-tools 中的 kexec 二进制文件大约需要 300KB(x86_64 和 -Os)。即使将它添加到busybox,它也不会比这小很多,因为它确实需要做一些在busybox 中其他任何地方都没有做过的相当复杂的事情。

如果你连 300KB 都没有,那么你可能应该从busybox 本身中删除配置选项以节省空间。使用 uClibc,您还可以删除一些不需要的选项,例如 wchar 和 threading。确保使用静态链接,它可以节省一点空间。

下面的Buildroot defconfig 会生成一个正好为 1.4MB 的 initramfs。

BR2_x86_64=y
BR2_x86_corei7=y
BR2_STATIC_LIBS=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
BR2_TOOLCHAIN_EXTERNAL_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/x86-64-core-i7/tarballs/x86-64-core-i7--uclibc--stable-2018.11-1.tar.bz2"
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_1=y
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
BR2_PACKAGE_KEXEC=y
BR2_PACKAGE_KEXEC_ZLIB=y
BR2_TARGET_ROOTFS_CPIO=y
# BR2_TARGET_ROOTFS_TAR is not set
于 2019-10-29T20:06:20.640 回答