1
ysc3839 2022-05-20 17:20:09 +08:00
印象中 OpenWrt 是可以选的,可能是你用的项目的问题?
|
3
choury 2022-05-20 17:29:36 +08:00
你真的编译过 arm64 的内核吗?它默认就是 gzip 压缩的,并由 bootloader 解压并启动,实在找不到内核自己再压一次的理由
|
4
hyln9 2022-05-20 17:43:18 +08:00 via iPhone
不支持 bzImage 不代表不能压缩
|
5
kgdb00 OP |
7
cev2 2022-05-20 20:04:49 +08:00 10
额,OP 的大前提理解是错误的:
“bzImage 本来就是为了方便内核能存储在嵌入式系统很小的 SPI 上” >> 并不是,bzImage ( big zImage 意为“大的”zImage ,和 bzip2 没有关系),怎么会“大的”反而是为了在嵌入式上呢,bzImage 是当初专门为 x86 架构搞出来的东西。 下面以最新的主线内核来举例吧: ① [第 335 行:define archhelp echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)' echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)' echo '* xipImage - XIP kernel image, if configured (arch/$(ARCH)/boot/xipImage)' echo ' uImage - U-Boot wrapped zImage' echo ' bootpImage - Combined zImage and initial RAM disk' 来源: [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/Makefile?h=v5.18-rc7#n335] >> 可以看到在 ARM 上内核支持 zImage 、Image 、xipImage 、uImage 、bootpImage ,不支持 bzImage ,→_→那我要是手动指定 bzImage 会怎样? [第 306 行:# Convert bzImage to zImage bzImage: zImage] 来源: [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/Makefile?h=v5.18-rc7#n306] >> →_→会自动变成 zImage ② [第 207 行:define archhelp echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)'] 来源: [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm64/Makefile?h=v5.18-rc7#n207] >> 可以看到在 ARM64 上内核支持 Image.gz 、Image ,是不支持 zImage 和 bzImage 的,至于为啥不支持,可能是开发者觉得没必要,也可能是觉得这活儿交给 boot loader 够了,也可能是纯粹优先级太低没动力(懒) 与 x64&x86 一脉相承不同,ARM64 跟 ARM 的关系就和雷锋和雷峰塔的关系似的,跟 MIPS64 血缘关系更近 ③ [第 299 行:define archhelp echo '* bzImage - Compressed kernel image (arch/x86/boot/bzImage)'] 来源: [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/Makefile?h=v5.18-rc7#n299] >> 可以看到在 x86 上只支持 bzImage ④ 另外在内核文档这里也写了建议在 ARM64 上如需要使用压缩请使用 bootloaders 实现: [第 58 行:3. Decompress the kernel image ------------------------------ Requirement: OPTIONAL The AArch64 kernel does not currently provide a decompressor and therefore requires decompression (gzip etc.) to be performed by the boot loader if a compressed Image target (e.g. Image.gz) is used. For bootloaders that do not implement this requirement, the uncompressed Image target is available instead.] 来源: [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/arm64/booting.rst?h=v5.18-rc7#n58] |
9
12101111 2022-05-20 20:52:31 +08:00
最早 Linux 的内核是在软盘上启动的, 文件名是 Image ,rootfs 在另一个硬盘上,后来软盘放不下内核了,因此搞了自解压出来,文件名就改成了 zImage ,再后来连压缩后的内核也放不下了,这才有 bzImage 这个 b 的出现,说明这个内核是 Big 到软盘放不下
网上搜到了一个 Linux 1.0 的源码,https://github.com/kalamangga-net/linux-1.0 上面的 README 里写了,编译出来的文件名是 zImage 选项里可以改压缩模式也是继承自 Linux 0.9x 时代的压缩代码,当时 Linux 只支持 386 ,根本就不跨 CPU. arm 又不需要软盘这种文物,而是靠 BootLoader 启动的,所以就没有这种自解压的代码. |
10
cev2 2022-05-20 20:56:36 +08:00
@kgdb00 #8 我猜的啊,不一定准确。在 i386 那个比尔盖茨说“640KiB 内存对于任何人来说都足够了”的年代,zImage (有体积限制,大概几 MB ?)是满足需求的。
后来 x86 上的内核体积越来越大,单个 zImage 已经装不下了,就出了 bzImage 。类似硬盘上的分区表,也是经历了从 MBR 到 GPT 的转变。还有 BIOS 到 UEFI 也是一样,x86 的历史太长了,历史包袱太多。 大概在 2009 年时,x86 的内核体积早已经到了无论如何 zImage 都装不下了,内核就把 x86 对 zImage 的支持删掉了。 |