GNU/Linux >> Linux の 問題 >  >> Linux

バイナリのサイズの違い - x86_64 と ARM

カーネル コードに関しては、非常に小さな部分 (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 マシン コードは 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 へのアクセスが遅かったため、RISC が主流でした。 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

元の質問に戻ります:

  • ARM カーネルは、特定のディストリビューションのベース ハードウェアにおけるアーキテクチャの多様性が少ないため、サイズが「大きく」なります。
  • しかし、さらに重要なことに、生成されるコードがより効率的でコンパクトになるため、サイズが小さくなります。

「バイナリ」カーネル (vmlinuz など) は、圧縮されたカーネルの残りの部分を圧縮解除する短いコードです。ファイルの先頭の大部分が同じであるため、これらには多くの共通点があります (したがって、同じように圧縮されます)。

サイズの違い ソース アーカイブのうちの 1 つはあまり関係がなく、あるバージョンから次のバージョンへの変更のほとんどは 変更された 行です。 、および新しいドライバーが追加されました (また、ドライバーはバイナリ カーネルには表示されません。一部のマシンでのみ使用されるため、通常は外部モジュールで使用されます)。


Linux
  1. [[$ a ==Z*]]と[$a==Z *]の違いは?

  2. Sudo Su –とSudo Su —の違いは何ですか?

  3. EotとEofの違いは?

  1. ディレクトリサイズの計算の違いは?

  2. [0-9]、[[:digit:]]とDの違いは?

  3. GtkとQtアプリケーションの違いは?

  1. ブロックサイズとクラスターサイズの違いは?

  2. 配管とコマンド拡張の違いは?

  3. SnatとMasqueradeの違いは?