当对 x86_64 编译的 Linux 内核进行二进制比较时,版本之间的差异相对较大(远超过 25%)。不同版本的源档案之间的大小差异较小(大约 8% 或更小)。
ARM 的二进制内核映像之间的大小差异是否会比 x86_64 的更小?我在某处读到,ARM 可执行文件之间的二进制差异小于 x86_64 可执行文件,因为编译后的代码放置在更可预测的位置,但我不记得在哪里找到它。
二进制 ARM Linux 内核映像版本之间的差异是否小于 x86_64 版本之间的差异?
答案1
至于内核代码,除了很小一部分(1%到5%?)的特定于体系结构的代码之外,所有内核源代码对于所有体系结构都是通用的。
关于二进制文件:
实际上,在大多数 Linux 发行版中,vmlinuz
它是一个符号链接,指向实际的 gzip 压缩内核代码;喜欢vmlinuz-3.16.0-4-amd64
。我确信OP正在谈论后者,但是为了读者的利益而提及前者。
https://www.ibm.com/developerworks/community/blogs/mhhaque/entry/anatomy_of_the_initrd_and_vmlinuz
虽然 ARM 代码确实更小,但即使内核没有被压缩,ARM 中的内核代码通常是定制的,并且激活的代码比 Intel 对应版本少得多(例如 Intel 有很多视频卡,即使只是模块存根,而通常定制的 ARM 内核只需处理 SoC 中存在的部分)。
此外,比较已经压缩的随机二进制 blob 可能并不总是产生真实结果,因为根据一些奇怪的巧合,由于某些压缩优化,较大的二进制可能会变得更小。
因此,实际上,为了有效地比较二进制内核,您必须使用相同的选项来编译它们,并保持它们未压缩(或解压缩生成的vmlinuzxxx
文件)。
公平的匹配是比较其他非压缩二进制文件,例如/bin/ls
、 或/usr/sbin/tcpdump
,以及与我们尝试匹配的架构类似的架构(ARM 机器仍然主要是 32 位,但已经有一些 64 位机器)
不用说,在 ARM 中编译的相同代码总是(远)小,因为 ARM 机器代码是 RISC 平台代码。它也具有较小的机器代码指令子集,从而产生较小的代码。另一方面,英特尔拥有更大的指令集,这也是由于与多代微处理器的向后兼容继承。
从http://www.decryptedtech.com/editorials/intel-vs-arm-risc-against-cisc-all-over-again
RISC CPU 的概念是一个古老的概念,而且也是一种非常高效的概念。在 RISC CPU 中,每条指令运行的工作负载较小,这些指令通常也分为 I/O 和内存,以进一步消除开销。这可以非常有效地利用 CPU 和内存时间,但也可能需要软件方面的一些庞大代码才能使一切正常工作。当 RISC 最初被开发出来时,这是一种可行的方法,因为内存和 HDD 访问速度很慢。 x86 CPU 中庞大且复杂的指令在较旧的 CPU 上很麻烦,并且无法跟上 RISC 系统的步伐。
然而,对话还不够直接,因为英特尔芯片现在是一个复杂的野兽,在伪 CISC 层深处,他们有 RISC 策略和设计,可以解码和模拟我们所知道的英特尔操作码。
与 MIPS 相比,ARM 操作码也很庞大,因为 ARM 是一种廉价处理器,具有专用于视频解码的专用指令(大约 30% 的处理器芯片专用于这些指令)。
作为一个简短的练习,使用 tcpdump 二进制文件和我可以访问的四种 Linux 架构:
MIPS 32 位 -> 502.4K
ARM 32 位 -> 718K
Intel 32 位 (i386) -> 983K
Intel 64 位 (x86_64) -> 1.1M
那么回到你原来的问题:
- ARM 内核的大小“增长”得较小,因为该架构在特定发行版的基础硬件中的多样性较少。
- 然而,更重要的是,它们的大小增长得更小,因为生成的代码更加高效和紧凑。
答案2
“二进制”内核(vmlinuz
或类似的)是一小段代码,用于解压缩压缩内核的其余部分。它们有很多共同点,因为文件开头的很大一部分是相同的(因此它压缩为相同)。
差异尺寸源档案的内容相当无关紧要,从一个版本到下一个版本的大部分更改都是行改变了和新司机添加(驱动程序不会出现在二进制内核中,它们仅在某些机器中使用,因此通常是外部模块)。