IA-32基本実行環境
3
・
パフォーマンス監視カウンタ:パフォーマンス監視カウンタは、監視対象となるプロ セッサ・パフォーマンス・イベントの中に含まれるものである。『IA-32
インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、下巻』の第15
章の「パフォーマンス監視の概要」の項を参照のこと。
本章の後半では、メモリの構成とアドレス空間、基本プログラム実行レジスタ、アド レス指定モードについて説明する。図
3-1.
に記載されている、その他のプログラム実 行リソースについては、本巻の以下の章を参照のこと。・ x87 FPU
レジスタ - 第8
章「x87 FPUによる プログラミング」を参照。・ MMX
テクノロジ・レジスタ - 第9
章「インテル® MMX®
テクノロジによるプロ グラミング」を参照。・ XMM
レジスタ-第10
章「ストリーミングSIMD
拡張命令(SSE
)によるプログ ラミング」、第11
章「ストリーミングSIMD
拡張命令2
(SSE2
)によるプログラミ ング」、第12
章「ストリーミングSIMD
拡張命令3
(SSE3
)によるプログラミン グ」を参照。・
スタックの実装とプロシージャ・コール - 第6
章「プロシージャ・コール、割り
込み、例外」を参照。IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
3-6
フラット・メモリ・モデル(図
3-2.
を参照)では、メモリは、プログラムの視点から は、リニアアドレス空間と呼ばれる単一の連続したアドレス空間のように見える。コード(すなわちプログラムの命令)、データ、プロシージャ・スタックはすべて、こ のアドレス空間に格納される。リニアアドレス空間では、バイトによるアドレス指定 が可能であり、アドレスは
0
~2
32− 1
の範囲で連続している。リニアアドレス空間内 の任意のバイトに対するアドレスは、リニアアドレスと呼ばれる。セグメント化メモリモデルでは、メモリは、プログラムの視点からは、セグメントと 呼ばれる独立したアドレス空間のグループのように見える。このモデルを使用する場 合、コード、データ、およびスタックは、一般的には独立したセグメントに格納され る。セグメント内のバイトをアドレス指定するには、プログラムによって、セグメン ト・セレクタとオフセットで構成される論理アドレスを発行しなければならない。(論 理アドレスは、farポインタと呼ばれる。)セグメント・セレクタで、アクセスの対象 となるセグメントを識別し、オフセットでそのセグメントのアドレス空間にあるバイ トを識別する。
IA-32
プロセッサ上で動作するプログラムでは、異なるサイズとタイ プのセグメントを最大16,383
までアドレス指定できる。また、各セグメントのサイズ は、最大2
32バイトまでである。内部的には、システムに対して定義されたセグメントはすべて、プロセッサのリニア アドレス空間にマッピングされる。したがって、プロセッサがメモリにアクセスする ときに、プロセッサはそれぞれの論理アドレスをリニアアドレスに変換する。この変 換は、アプリケーション・プログラムからは透過である。
セグメント化メモリを使用する最大の理由は、プログラムやシステムの信頼性を向上 させることにある。例えば、プログラムのスタックを別個のセグメントに配置すると、
スタックが大きくなってコード空間やデータ空間にまで入り込み、命令やデータが上 書きされてしまうのを防止できる。オペレーティング・システムやエグゼクティブの コード、データ、スタックを別々のセグメントに配置すれば、アプリケーション・プ ログラムとの間で相互に保護もできる。
フラットまたはセグメント化メモリモデルでは、リニアアドレス空間が、直接または ページングを使用して、プロセッサの物理アドレス空間にマッピングされる。直接 マッピングを使用する場合(ページング無効)は、各リニアアドレスは物理アドレス に
1
対1
で対応する(つまり、リニアアドレスは、変換されずにプロセッサのアドレ スラインに送られる)。IA-32
アーキテクチャのページ機構を使用する場合(ページン グ有効)は、リニアアドレス空間はページに分割され、各ページが仮想メモリにマッ ピングされる。仮想メモリのページは、必要に応じて物理メモリにマッピングされる。オペレーティ ング・システムまたはエグゼクティブがページングを使用する際は、このページング 機構はアプリケーション・プログラムからは透過的である。つまり、アプリケーショ ン・プログラムは、リニアアドレス空間だけを認識する。
IA-32基本実行環境
3
実アドレス・モード・メモリ・モデルでは、インテル®
8086
プロセッサのメモリモデ ルが使用される。このメモリモデルは、インテル8086
プロセッサ上で動作するように 開発された既存のプログラムとの互換性を維持するために、IA-32 アーキテクチャ上 でサポートされている。実アドレスモードでは、セグメント化メモリの特定のインプ リメンテーションを使用して、プログラムやオペレーティング・システムあるいはエ グゼクティブ用のリニアアドレス空間は、それぞれ最大64K
バイトのサイズのセグメ ント配列で構成される。実アドレスモードにおけるリニアアドレス空間の最大サイズ は、2
20バイトである。このメモリモデルの詳細については、『IA-32
インテル®アー キテクチャ・ソフトウェア・デベロッパーズ・マニュアル、下巻』の第16
章「8086
エミュレーション」を参照のこと。図3-2. 3つのメモリ管理モデル リニアアドレス
フラットモデル
リニアアドレス空間*
セグメント・セレクタ
オフセット
セグメント・セレクタ
セグメント化モデル
実アドレス・モード・モデル
同一サイズのセ
ローカル
オフセット
グメントに分割 されたリニア アドレス空間 アドレス
ローカル アドレス
リニア アドレス 空間* セグメント
* リニアアドレス空間では、フラットモデルまたは セグメント化モデルの場合にページングが可能。
IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
3-8
3.3.1.
動作モード対メモリモデルIA-32
プロセッサ用のコードを開発するときは、プロセッサがコードを実行する際の動作モードやメモリモデルをプログラマは理解しておかなければならない。動作モー ドとメモリモデルとの関係は、次のようになる。
・
保護モード。保護モードでは、プロセッサは前節で説明した任意のメモリモデル を使用できる。(実アドレスモードのメモリモデルは、通常は、プロセッサが仮想8086
モードにある場合にのみ使用する。)いずれのメモリモデルを使用するかは、オペレーティング・システムやエグゼクティブの設計によって決まる。マルチタ スクがインプリメントされている場合は、個々のタスクで異なるメモリモデルを 使用できる。
・
実アドレスモード。実アドレスモードでは、プロセッサは実アドレスモードのメ モリモデルしかサポートしない。・
システム管理モード(SMM)。SMM
では、プロセッサはシステム管理モードRAM
(SMRAM)と呼ばれる独立したアドレス空間に切り替える。このアドレス区間内 のバイトをアドレス指定する際に使用されるメモリモデルは、実アドレス・モー ド・モデルと同じである。
SMM で使用されるメモリモデルの詳細については、
『IA-32 インテル
®アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、下
巻』の第
13
章「システム管理モード(SMM)」を参照のこと。3.3.2. 32
ビットと16
ビットのアドレスサイズとオペランド・サイズ高度な IA-32 プロセッサは、
32
ビットあるいは16
ビットのアドレスサイズとオペラン ド・サイズを設定できる。32ビットのアドレスサイズとオペランド・サイズを使用す る場合は、最大のリニアアドレスまたはセグメント・オフセットはFFFFFFFFH(2
32-1
)になり、オペランド・サイズは一般的には8
ビットか32
ビットになる。16
ビット のアドレスサイズとオペランド・サイズを使用する場合は、最大のリニアアドレスま たはセグメント・オフセットはFFFFH(2
16-1)になり、オペランド・サイズは一般的
には8
ビットか16
ビットになる。32
ビットのアドレス指定を使用する場合は、論理アドレス(すなわちfar
ポインタ)は16
ビットのセグメント・セレクタと32
ビットのオフセットで構成される。一方、16 ビットのアドレス指定を使用する場合は、論理アドレスは16
ビットのセグメント・セ レクタと16
ビットのオフセットで構成される。命令プリフィックスを使用すれば、プログラム内でデフォルトのアドレスサイズやオ ペランド・サイズを一時的にオーバーライドすることが可能である。
保護モードで動作する場合は、デフォルトのアドレスサイズとオペランド・サイズは、
現在実行されているコード・セグメントのセグメント・ディスクリプタによって定義 される。セグメント・ディスクリプタは、アプリケーション・コードからは通常見る