コンピュータサイエンスにおいて、インプレース実行( XIP ) とは、プログラムをRAMにコピーするのではなく、長期ストレージから直接実行する方法です。これは、共有メモリを使用して必要なメモリの総量を削減する 拡張です。
その一般的な効果は、プログラム テキストが書き込み可能なメモリを消費せず、動的データ用にメモリを節約し、プログラムのすべてのインスタンスが単一のコピーから実行されることです。
これが機能するには、いくつかの基準を満たす必要があります。
- ストレージは、通常のメモリと同様のインターフェースをCPUに提供する必要があります(または、アダプティブ レイヤーが存在する必要があります)。
- このインターフェースは、ランダム アクセスパターンで十分に高速な読み取り操作を提供する必要があります。
- ファイルシステムを使用する場合は、適切なマッピング関数を公開する必要があります。
- プログラムは、システム内でストレージが表示されるアドレスを認識するようにリンクされるか、位置に依存しない必要があります。
- プログラムは、ロードされたイメージ内のデータを変更してはなりません。
ストレージ要件は通常、NOR フラッシュ メモリまたはEEPROM を使用することで満たされます。これらは読み取り操作用にバイト アドレス指定できますが、ほとんどのセットアップでは通常のシステム RAM よりも少し遅くなります。
ブートロード中のXIP
x86 システムでは、通常、第 1 ステージ ブート ローダーは、電源投入時にフラッシュ チップがマップされるアドレスで実行するようにリンクされた XIP プログラムであり、システム RAM を設定するための最小限のプログラム (個々のボードで使用されるコンポーネントに依存し、適切なシーケンスをプロセッサ ハードウェアに組み込むことができるほど一般化できない) を含み、その後、第 2 ステージ ブートローダーまたは OSカーネルをRAM にロードします。
この初期化中は書き込み可能なメモリが利用できない可能性があるため、すべての計算はプロセッサ レジスタ内で実行する必要があります。このため、第 1 段階のブート ローダはアセンブリ言語で記述される傾向があり、次のプログラムに通常の実行環境を提供するための最小限のことしか行いません。一部のプロセッサでは、チップ自体に少量の SRAM を埋め込んだり[1]、オンボード キャッシュ メモリを RAM として使用できるようにしたりして、この第 1 段階のブート ローダを高級言語で記述しやすくしています [2] 。
カーネルやブートローダの場合、アドレス空間は一般に内部的に割り当てられるため、XIP を使用するには、変更不可能なデータと変更可能なデータを異なるアドレス範囲に配置するようにリンカーに指示し、データに正常にアクセスできると想定するコードを実行する前に、変更可能なデータを書き込み可能なメモリにコピーするメカニズムを提供するだけで十分です。これは、前の段階の一部として、またはプログラムの先頭の小さなコード セグメント内で実行できます。
仮想メモリを提供しないシステムで実行されるアプリケーション プログラムなど、アドレス空間が外部的に割り当てられる場合、コンパイラは、データ領域のプライベート コピーへのポインタにオフセットを追加することによって、変更可能なすべてのデータにアクセスする必要があります。この場合、外部ローダーはインスタンス固有のメモリ領域を設定する必要があります。
x86システムでは、通常、BIOS / UEFI ROMは電源投入時に固定メモリ空間にマップされ、[3] x86システムのBIOS / UEFIはXIPを使用してメインメモリを初期化します。 ARMおよびRISC-V組み込みシステムでは、通常、SoC組み込みのブートROMは電源投入時に固定メモリ空間にマップされ、ブートROMはNANDフラッシュメモリからDas U-Bootなどの組み込みブートローダを見つけてロードすることができ、そのブートプロセスは専用のEEPROMチップを使用しません。
ファイルシステムとしてのXIP
XIP はファイル システムに要求する要件を満たせないことがよくあります。ページ テーブルのないシステムでは、ファイル全体を連続したバイト内に保存する必要があり、断片化してはなりません。一方、フラッシュ ベースのファイル システムでは、フラッシュ チップの消去サイクルが最も少ないセクターにデータを分散し、チップの 摩耗を均等化して寿命を延ばすことを目的とすることがよくあります。
これらすべての複雑さと速度のトレードオフにより、XIP は一般に第 1 段階のブートローダまたは RAM が極端に不足している場合にのみ使用されます。特に、第 2 世代から第 4 世代のビデオゲーム コンソールは、ROM カートリッジのアドレスとデータ バスをコンソールのアドレスとデータ バスに接続します。[4]これにより、たとえばAtari 2600 はジョイスティック インターフェイス ICの 128 バイトの RAM のみで動作します。
AXFS ( Advanced XIP File System )と呼ばれる Linux 用の比較的新しいファイル システムは、特にユーザー空間アプリケーションのインプレース実行に関して、XIP に関連するいくつかの欠点を克服することを目的としています。たとえば、実行可能なバイナリ ファイルを「XIP 領域」に分割できるため、前述の断片化の制限を回避できます。
NetBSD実装も開発中です。[5]
参照
参考文献
- ^ Samsung S3C2416Xにはシステムバス上で利用可能な64kBの組み込みSRAMがあります
- ^ Broadcom BCM2835は、SDRAMが初期化される前に、レベル2キャッシュをブートローダーRAMとして使用します。
- ^ 「おい、俺の4ギガバイトのRAMはどこだ?」Coding Horror . 2007-03-08 . 2024-08-31閲覧。
- ^ 米国特許 4485457、Richard K. Balaska、Robert L. Hunter、および Scott S. Robinson、「RAM およびページ切り替え可能な ROM を含むメモリ システム」、1984 年 11 月 27 日発行、CBS Inc. に譲渡。
- ^ 上林正夫 (2010-04-05). 「NetBSD の eXecute-In-Place (XIP) サポート」(PDF) . BSDCan.
外部リンク
- Bird, Tim R. (2004)。「Linux の起動時間を改善する方法」(PDF)。オタワ Linux シンポジウム。
- Hulbert, Jared (2008)。「高度な XIP ファイル システムの紹介」(PDF)。オタワ Linux シンポジウム。
- Wilshire, Phil (2002-08-28). 「eXecute In Place (XIP) の概要」。uCdot 。2007-10-20にオリジナルからアーカイブ。2007-09-25に取得。
- Wellhöfer, Sören (2009-09-17). 「Linux と AXFS を使用したアプリケーション eXecute-In-Place (XIP)」。2009 年 9 月 17 日閲覧。
- 「PowerPC 上で Linux を XIP (Execution In Place) 用に構成する」。DENX ソフトウェア エンジニアリング。
- 「カーネルXIP」。組み込み Linux Wiki。
- 「Linux アプリケーション XIP」。Embedded Linux Wiki。
- 「インプレース実行ファイル システム ドライバー - xip2fs」。S /390 用 Linux。
