• 検索結果がありません。

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

ビットのオフセットで構成される。

命令プリフィックスを使用すれば、プログラム内でデフォルトのアドレスサイズやオ ペランド・サイズを一時的にオーバーライドすることが可能である。

保護モードで動作する場合は、デフォルトのアドレスサイズとオペランド・サイズは、

現在実行されているコード・セグメントのセグメント・ディスクリプタによって定義 される。セグメント・ディスクリプタは、アプリケーション・コードからは通常見る