X86_64用にコンパイルされたLinuxカーネル間でバイナリ差分を実行する場合、バージョンごとの違いは比較的大きくなります(25%をはるかに超える)。バージョンごとのソースアーカイブ間のサイズの違いは小さくなります(約8%以下)。
ARMのバイナリカーネルイメージ間のサイズの違いは、x86_64の場合よりも小さくなりますか?コンパイルされたコードがより予測可能な場所に配置されているため、ARM実行可能ファイル間のバイナリの違いがx86_64実行可能ファイルよりも小さいことをどこかで読みましたが、どこで見つけたか思い出せません。
バイナリARM Linuxカーネルイメージのバージョン間の違いは、x86_64よりも小さいですか?
カーネルコードに関しては、非常に小さな部分(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カーネルは1つだけを処理する必要がありますそれはSoCに存在します)。
さらに、すでに圧縮されたランダムバイナリブロブを比較すると、いくつかの奇妙な偶然の一致により、圧縮の最適化により大きなバイナリが小さくなる可能性があるため、常に真の結果が得られるとは限りません。
したがって、実際には、バイナリカーネルを効果的に比較するには、同じオプションを使用してそれらをコンパイルし、非圧縮のままにする(または結果のvmlinuzxxx
fileを解凍する)必要があります。
公平な一致とは、たとえば/bin/ls
または/usr/sbin/tcpdump
などの他の非圧縮バイナリを比較することであり、さらに、照合しようとしているものと同様のアーキテクチャです(ARMマシンは、主に32ビットですが、ただし、64ビットのものはすでにいくつかあります)
言うまでもなく、ARMマシンコードはRISCプラットフォームコードであるため、ARMでコンパイルされた同じコードは常に(はるかに)小さくなります。複数の世代のマイクロプロセッサとの互換性の継承により、Intelは命令のセットが大きくなります。
から 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システムに対応できませんでした。
それにもかかわらず、Intelチップは最近複雑な獣であり、疑似CISC層の奥深くに、IntelオペコードをデコードおよびエミュレートするRISC戦略と設計があるため、会話はそれほど単純ではありません。
ARMオペコードもMIPSと比較してかさばります。これは、ARMは、ビデオデコード専用の特殊な命令を備えた安価なプロセッサであるためです(の約30%プロセッサダイはそれら専用です)。
簡単な練習として、tcpdumpバイナリと、私がアクセスできる4つのLinuxアーキテクチャを取り上げます。
MIPS 32ビット-> 502.4K
ARM 32ビット-> 718K
Intel 32ビット(i386)-> 983K
Intel 64ビット(x86_64)-> 1.1M
では、元の質問に戻りましょう。
「バイナリ」カーネル(vmlinuz
など)は、圧縮されたカーネルの残りの部分を適切に解凍する短いコードです。ファイルの先頭の大部分が同じであるため、それらには共通点がたくさんあります(したがって、ファイルは同じに圧縮されます)。
ソースアーカイブのサイズの違いはかなり無関係であり、あるバージョンから次のバージョンへの変更のほとんどは行変更、および新しいドライバー追加です。 (そして、ドライバーはバイナリカーネルには表示されません。一部のマシンでのみ使用されるため、通常は外部モジュールです)。