V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
kgdb00
V2EX  ›  Linux

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

  •  
  •   kgdb00 · 2022-05-20 16:58:59 +08:00 · 4126 次点击
    这是一个创建于 954 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用 make ARCH=x86 menuconfig 配置内核,可以在"General setup"菜单下选择"Kernel compression mode",用来指定 bzImage 的压缩方式,而使用 make ARCH=arm64 menuconfig 就没有这个选项。

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

    而且 arm64 这个只是用 gzip 把 Image 压缩了一下,跟 x86 用的 bzImage 完全不一样,bzImage 是可以在执行时自己解压缩自己的。
    ysc3839
        6
    ysc3839  
       2022-05-20 18:19:55 +08:00 via Android
    @kgdb00 我不确定,已经有一段时间没自己编译过了。
    cev2
        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]
    kgdb00
        8
    kgdb00  
    OP
       2022-05-20 20:20:54 +08:00
    @cev2 感谢回复,你认为 x86 架构搞个压缩的 bzImage 有什么意义?
    12101111
        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 启动的,所以就没有这种自解压的代码.
    cev2
        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 的支持删掉了。
    msg7086
        11
    msg7086  
       2022-05-21 06:00:14 +08:00 via Android
    @cev2 鲁迅:比尔盖子没有说过这句话。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2887 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:53 · PVG 20:53 · LAX 04:53 · JFK 07:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.