为什么 arm64 架构的 Linux 内核不能压缩,而 x86 却可以?

2022-05-20 16:58:59 +08:00
 kgdb00
使用 make ARCH=x86 menuconfig 配置内核,可以在"General setup"菜单下选择"Kernel compression mode",用来指定 bzImage 的压缩方式,而使用 make ARCH=arm64 menuconfig 就没有这个选项。

bzImage 本来就是为了方便内核能存储在嵌入式系统很小的 SPI 上,嵌入式系统很多都是 ARM 架构,结果 ARM 不能压缩,很奇怪。
3806 次点击
所在节点    Linux
11 条回复
ysc3839
2022-05-20 17:20:09 +08:00
印象中 OpenWrt 是可以选的,可能是你用的项目的问题?
kgdb00
2022-05-20 17:25:08 +08:00
@ysc3839 最新的 mainline 内核都不行,openwrt 应该也不行。
choury
2022-05-20 17:29:36 +08:00
你真的编译过 arm64 的内核吗?它默认就是 gzip 压缩的,并由 bootloader 解压并启动,实在找不到内核自己再压一次的理由
hyln9
2022-05-20 17:43:18 +08:00
不支持 bzImage 不代表不能压缩
kgdb00
2022-05-20 17:57:50 +08:00
@choury @hyln9 我知道 ARCH=arm64 默认会用 gzip 压缩 Image ,但由于公司用的 u-boot 是老版本的,booti 命令不支持解压缩。

而且 arm64 这个只是用 gzip 把 Image 压缩了一下,跟 x86 用的 bzImage 完全不一样,bzImage 是可以在执行时自己解压缩自己的。
ysc3839
2022-05-20 18:19:55 +08:00
@kgdb00 我不确定,已经有一段时间没自己编译过了。
cev2
2022-05-20 20:04:49 +08:00
额,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]
kgdb00
2022-05-20 20:20:54 +08:00
@cev2 感谢回复,你认为 x86 架构搞个压缩的 bzImage 有什么意义?
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 启动的,所以就没有这种自解压的代码.
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 的支持删掉了。
msg7086
2022-05-21 06:00:14 +08:00
@cev2 鲁迅:比尔盖子没有说过这句话。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/854228

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX