Execute in place(XIP)とは、プログラムをRAMにコピーせず、補助記憶装置から直接実行する方式のことをいう。これは、共有メモリを用いた必要なメモリ容量の削減の延長といえる。
この方式の主な効果は、プログラムが書き込み可能なメモリを消費せず、動的なデータのために節約できること、そして全てのインスタンスが単一のコピーから実行されることである。
この方式が機能するには、いくつかの条件を満たす必要がある。
- ストレージは、通常のメモリと同様のインタフェースをCPUに対して提供しなければならない(もしくはアダプティブレイヤが存在していなければならない)。
- このインタフェースは、ランダムアクセスに対して十分に高速な読み出し操作を提供しなければならない。
- ファイルシステムを使用する場合は、適切なマッピング機能が公開されている必要がある。
- プログラムは、システム内でのストレージの出現位置を認識するためにリンクされているか、位置独立である必要がある。
- プログラムは、読み込まれたイメージ内のデータを変更してはならない。
ストレージの要件は通常、ワード単位でアドレス指定可能なNOR型フラッシュメモリやEEPROMを使用することによって満たされるものの、ほとんどの場合通常のシステムRAMよりも少し遅くなる。
ブート中のXIP
通常、一次ブートローダは、電源投入時にフラッシュチップがマップされるアドレスで実行されるXIPプログラムであり、システムRAMのセットアップを行う最小限のプログラムを含んでいる(この手順は個々ボードのコンポーネントに依存しており、一般化できず、セットアップ手順をプロセッサ側に埋め込むことはできない)。その後、二次ブートローダやOSのカーネルがRAMに読み込まれる。
初期化中は書き込み可能なメモリが利用できない可能性があるため、全ての計算をプロセッサのレジスタ内で実行しなければならない。そのため、一次ブートローダはアセンブリ言語で書かれ、次のプログラムに正常な実行環境を提供するための最低限のことのみを実行する傾向にある。プロセッサによっては、小さなSRAMを内蔵するか[注 1]、ボード上のキャッシュメモリをRAMとして使用できるようにして、[注 2]一次ブートローダを高水準言語で書きやすくしている。
カーネルやブートローダの場合、アドレス空間は通常内部的に割り当てられるため、それらにXIPを使用する場合は、リンカに対し変更可能なデータと変更不可能なデータを異なるアドレスに配置するよう指示し、かつ変更可能なデータが正常にアクセスできるように、実行前にそれらを書き込み可能なメモリにコピーする方法を提供すれば良い。この方法は、プログラム実行前の段階で実行することも、プログラムの最初の部分に組み込んでおくことも可能である。
仮想メモリを提供しないシステムで実行されるアプリケーションのように、アドレス空間が外部的に割り当てられる場合、コンパイラは全ての変更可能なデータにアクセスするために、データ領域のプライベートなコピーへのポインタにオフセットを追加する必要がある。この場合、外部ローダはインスタンス固有のメモリ領域を設定する責任がある。
BIOSやUEFIは、メインメモリの初期化にXIPを利用している。
ファイルシステムとしてのXIP
XIPは、しばしば満たすのが難しいファイルシステムの要件を課す。ページテーブルのないシステムにおいては、ファイル全体が連続したバイト内に格納され、断片化されてはならない。しかし、フラッシュベースのファイルシステムの多くは、データを消去サイクルが最も少ないところに書きこみ、セクタを分散させチップの摩耗を抑え寿命を伸ばす(ウェアレベリング)ようになっている。
このような複雑性と速度のトレードオフにより、XIPは一般的に一次ブートローダやRAMが極端に不足しているときにのみ使用される。特に、第二世代から第四世代ゲーム機においては、ロムカセットのアドレスバスとデータバスをゲーム機のそれに接続する手法をとっており[1]、例えばAtari 2600はジョイスティックのインタフェースICに搭載された128バイトのRAMのみで動作させることができる。
比較的新しいLinuxのファイルシステムであるAXFS(Advanced XIP File System)は、XIPに関連する欠点(特にユーザ空間でのアプリケーションのXIPに関するもの)を解決を目的としている。例えば、実行可能なバイナリファイルを「XIP領域」に分割することで、前述した断片化に関する制限を回避することができる。
2010年時点で、NetBSD実装が開発中である。[2]
脚注
注釈
- ^ Samsung S3C2416Xにはシステムバス上で利用可能な64kBのSRAMが組み込まれている。
- ^ BroadcomのBCM2835は、SDRAMが初期化される前はL2キャッシュをブートローダのRAMとして使用することができる。
出典
関連項目
外部リンク
Template:Firmware and booting