为什么在Linux中使用压缩内核镜像?

14

我在互联网上搜索了这个问题,但并没有找到任何有关这个问题的有用信息,“为什么使用像bzImage或vmlinuz这样的压缩内核映像作为初始内核映像”,

我能想到的可能解决方案是:

由于内存限制?

但最初压缩的内核映像位于硬盘或其他存储介质上,在启动时,在第二阶段引导加载程序之后,内核首先被解压缩到主存中,然后执行。

因此,当稍后需要将内核解压缩到主存中时,为什么需要首先对其进行压缩。我的意思是,如果主存可以容纳未压缩的内核映像,那么为什么需要压缩内核?

1个回答

30

通常,处理器的解压速度比I/O系统的读取速度更快。 通过减少I/O系统的读取,可以缩短引导时间。

当然,并非所有硬件组合都满足此假设。 但它经常成立。

对于嵌入式系统,另一个好处是内核映像在非易失性存储上占用的空间更小,这可能允许使用更小(且更便宜)的闪存芯片。 许多 这些系统 只有约32MB的系统RAM和约4MB的闪存。


1
对于嵌入式系统,内存限制是最合理的答案,你说得对。但对于拥有大型存储设备的个人电脑来说,处理器是否更重要呢? - user2311046
4
在个人电脑上,内核镜像的加载必须由引导加载程序使用非常通用、无特征的 BIOS 调用完成,这也意味着性能非常缓慢。没有 DMA、散射/聚集 I/O 和命令排队。EFI 使这种情况有所改善,但你仍然希望尽快加载最小化的内核并切换到与 I/O 控制器的本地通信。由于镜像加载非常缓慢,传输的镜像应尽可能小,这可以通过压缩来实现。 - Ben Voigt
2
一些系统也可以通过网络启动;您可能希望将恢复内核制作得非常小,以适合于USB存储器、过去的软盘或CD。最重要的是,.config文件意味着您不必这样做。由配置内核的人决定,Ben已经给出了有效的理由。矛盾的是,在具有执行就地闪存的嵌入式系统中,您可能不希望这样做。 - artless noise
1
@artlessnoise:让软盘适应是一个很大的挑战,但我从未见过不能容纳未压缩映像的USB或CD介质。当然,加载时间仍然非常重要。由于某种原因,我只看到引导加载程序使用执行-在-地方(execute-in-place);不确定Linux内核是否需要在可写内存中,以支持自修改代码。 - Ben Voigt
2
XIP_KERNEL 至少在 ARM 上得到支持。由于大多数 代码 部分都标记为 rx,因此这些部分可以映射到支持 XIP 的 NOR-flash、QuadSPI-flash、ROM 等,无需加载并且需要更低的 RAM 要求。对于 CDUSB,想法是不消耗太多空间来存储很少需要的 救援 映像;您可以双重使用存储空间。 - artless noise
@artlessnoise:在PC上,你永远不会注意到压缩与未压缩内核剩余的可用空间的差异。这一切都关乎性能。即使是XIP与解压到RAM之间的区别也是关于性能的——你提到的大多数闪存接口比RAM慢一个数量级(或者可能是两个)。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接