为什么 arm64 架构的 Linux 内核不能压缩,而 x86 却可以? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
kgdb00
V2EX    Linux

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

  •  
  •   kgdb00 2022-05-20 16:58:59 +08:00 4605 次点击
    这是一个创建于 1246 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用 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     Solana     2887 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 06:13 PVG 14:13 LAX 23:13 JFK 02:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86