我的板上有3 MB的SPI闪存,并且可以将bzImage,busybox initrd和coreboot ROM打包到此SPI闪存中。我还能够使用ROM kernel-as-bootloader引导至外壳。
我在USB设备上具有更大的内核。我也能够检测到USB并将其安装。但是问题是busybox似乎没有kexec实用程序。我不能使用任何其他initrd程序包,因为由于内存限制,我的cpio(未压缩)大小不应超过1.4 MB。 U-root具有kexec支持,但是最小图像大小很容易达到3MB,或者至少,我找不到一种比该大小更小的图像。
因此,有没有一种方法可以将kexec支持添加到busybox(编译静态二进制文件并复制到initrd?)或任何其他initrd程序包中,可以满足1.4MB大小的需要?
编辑
This post建议在busybox中可能有kexec支持,但我找不到任何痕迹。实际上,request to add kexec-tools到busybox已于十年前完成。但是当我在busybox中进行grep时,我看不到任何痕迹。
答案 0 :(得分:2)
kexec-tools的kexec二进制文件大约需要300KB(带有-Os的x86_64)。即使将其添加到busybox中,它也不会比它小很多,因为它确实需要做相当复杂的事情,而这些事情在busybox中其他任何地方都没有。
如果您甚至还没有300KB,那么您可能应该从busybox自身中删除配置选项以节省空间。使用uClibc,您还可以删除一些不需要的选项,例如wchar和线程。确保使用静态链接,这样可以节省一点空间。
以下Buildroot的defconfig生成的initramfs恰好为1.4MB。
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