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

0100WRXB

1.6. オペレーティング・システムに関する注意事項

1.6.1. CPUID 命令

1.6.3.2. IA-32e モードのアクティブ化

オペレーティング・システムは、以下の手順に従って、IA-32eモードをアクセスにす る必要がある。

1.

まず、ページングがイネーブルにされた保護モードから、CR0.PG = 0 に設定してペー ジングをディスエーブルにする。ページングのディスエーブルには、MOV CR0命令を 使用する(この命令は、IDがマッピングされたページ内に置かれていなければならな い)。

2. CR4.PAE = 1

にセットして、物理アドレス拡張機構をイネーブルにする。

PAE

をイネー ブルにしないと、

IA-32e

モードをイネーブルにしようとしたときに

#GP

フォルトが発 生する。

3.

レベル

4

ページ・マップ・テーブル(PML4)の物理ベースアドレスを

CR3

にロードする。

4. IA32_EFER.LME = 1

にセットして、

IA-32e

モードをイネーブルにする。

5. CR0.PG = 1

にセットして、ページングをイネーブルにする。これで、プロセッサは、

LMA

ビットを

1

にセットする。ページングをイネーブルにする

MOV CR0

命令とそれ に続く命令は、

ID

がマッピングされていないページへの分岐が実行可能になるまでは、

ID

がマッピングされたページ内に置かれていなければならない。

IA-32e

モードから従来のページング保護モードに戻るには、以下の手順に従って、

IA-32e

モードを非アクティブにし、ディスエーブルにする。

1.

互換サブモードでなければならない。

2. CR0.PG = 0

にクリアして、IA-32eモードを非アクティブにする。これで、プロセッサ は、

IA32_EFER.LMA = 0

に設定する。ページングのディスエーブルに使用される

MOV CR0

命令とそれに続く命令は、IDがマッピングされたページ内に置かれていなければ ならない。

3.

従来のページ・テーブル・ディレクトリのベースアドレスの物理ベースアドレスを

CR3

にロードする。

4. IA32_EFER.LME = 0

に設定して、IA-32e モードをディスエーブルにする。

5. CR0.PG = 1

に設定して、従来のページング保護モードをイネーブルにする。

6.

ページングをイネーブルにする

MOV CR0

命令の直後に、分岐命令を実行しなければな らない。MOV CR0 と分岐命令のいずれも、ID がマッピングされたページ内に置かれ ていなければならない。

IA-32e

モードをアクティブにした直後、システム・ディスクリプタ・テーブル・レジ

スタ(GDTR、LDTR、IDTR、TR)は、従来のディスクリプタ・テーブルを参照し続 ける。これらのディスクリプタによって参照されるテーブルは、すべてリニアアドレ ス空間の下位

4GB

内に置かれる。64ビット・オペレーティング・システムは、IA-32e モードをアクティブにした後、LGDT、LLDT、LIDT、LTR命令を使用して、64ビッ ト・ディスクリプタ・テーブルへの参照をシステム・ディスクリプタ・テーブル・レ ジスタにロードする必要がある。

ソフトウェアは、

IA-32e

モードがアクティブになってから、割り込みディスクリプタ・

テーブル・レジスタ(

IDTR

)の次の更新によって

64

ビット割り込みディスクリプタ・

テーブル(

IDT

)への参照が設定されるまでの間、例外や割り込みを発生させてはな らない。これは、

IA-32e

モードがアクティブになった直後は、

IDT

が従来の形式のま まになっているからである。

IDTR

の更新より前に割り込みや例外が発生すると、従 来の

32

ビット割り込みゲートが参照されて、

64

ビット割り込みゲートとして解釈さ れ、予測不可能な結果が発生する。外部割り込みは、CLI命令によってディスエーブ ルにできる。マスク不可割り込み(

NMI

)は、外部ハードウェアを使用してディス エーブルにしなければならない。

IA-32e

モードをアクティブにする前に、

64

ビットモードのページング・テーブルが、

物理アドレス空間の最初の

4GB

内に置かれていなければならない。これは、

IA-32e

モードをアクティブにする前に、ページ・ディレクトリ・ベースの初期化に使用され

MOV CR3

命令をレガシーモードで実行しなければならないからである(ページン

グをイネーブルにするには、

CR0.PG = 1

にセットする)。

MOV CR3

はレガシーモード で実行されるため、

CR3

レジスタの下位

32

ビットだけが書き込まれ、テーブルの位置 はメモリの下位

4GB

に制限される。

IA-32e

モードがアクティブになった後、ソフト ウェアは、物理メモリ内の任意の位置にページテーブルを再配置できる。

ソフトウェアが、

IA-32e

モードのアクティブ化に直接関連するイネーブル・ビット

IA32_EFER.LME

CR0.PG

CR4.PAE

)を変更しようとするたびに、プロセッサは

64

ビットモードの整合性チェックを実行する。整合性チェックが不合格になった場合、

プロセッサは一般保護例外(

#GP

)を生成する。

64

ビットモードの整合性チェックは、

プロセッサが未定義のモードやステートに移行して予測不可能な動作をすることを 防止する。

64

ビットモードの整合性チェックは、以下の場合に不適合になる。

ページングがイネーブルになっているとき、

IA-32e

モードをイネーブルまたはディ スエーブルにしようとした。

• IA-32e

モードがイネーブルになっているとき、物理アドレス拡張機構(PAE)をイ

ネーブルにする前にページングをイネーブルにしようとした。

• IA-32e

モードがアクティブになっているとき、物理アドレス拡張機構(

PAE

)を

ディスエーブルにしようとした。

• IA-32eモードをアクティブにしようとしたとき、現在の CSのLビットがセットされ

ていた。

• TR

には

16

ビット

TSS

が格納されていなければならない。

1-15.

は、

64

ビットモードの整合性チェックについてまとめたものである。

1.6.3.3.

仮想

8086

モード

プロセッサが

IA-32e

モードで動作しているときは、仮想

8086

モードはサポートされ ない。IA-32eモードがイネーブルになっているとき、EFLAGS.VMビットをセットし ようとすると、何も反応なしで無視される。

1.6.3.4.

互換モード

IA-32e

モード内の互換モードは、従来の

16

ビット

/32

ビットの

IA-32

アプリケーショ ンとのバイナリ互換性を維持している。従来の

16

ビットまたは

32

ビット・アプリケー ションのうち、仮想

8086モードで動作するものとハードウェア・タスク管理を使用す

るものは、互換モードではサポートしていない。

表1-15. IA-32eモードの整合性チェック レジスタ ビット チェック

EFER LME 0

1 if (CR0.PG ==1) then #GP(0) LME 1

0 if (CR0.PG == 1) then #GP(0)

CR0 PG 0

1 if ((IA32_EFER.LME == 1) & (CR4.PAE-0)) then #GP(0) CR4 PAE 1

0 if (IA32_EFER.LMA == 1) then #GP(0)

互換モードの実行は、コード・セグメントごとに行われる。これにより、従来の

16

ビット

/32

ビット・アプリケーションと、

64

ビットモードで動作する

64

ビット・アプ リケーションは、

64

ビット・オペレーティング・システム上で共存できる。

IA-32e

モードで動作するオペレーティング・システムは、コード・セグメント・ディスクリ プタの

CS.L

ビットを

0

にクリアして、既存の

16

ビット

/32

ビット・アプリケーション を実行できる。

CS.L = 0

の場合、

CS.D

ビット、アドレス・サイズ・プリフィックス、オペランド・サ イズ・プリフィックスについては、従来の

IA-32

の意味が保たれる。また、セグメン ト化がイネーブルになる。

IA-32e

モードがアクティブであっても、アプリケーション の観点から見ると、プロセッサは(

CS.D

の値に基づいて)従来の

16

ビットまたは

32

ビット・オペレーティング環境で動作している。

互換モードでは、IA-32eモードのアーキテクチャ上の定義によって、以下のシステム レベルのメカニズムが機能する。

リニアアドレスから物理アドレスへの変換には、64ビットモードの拡張された ページ変換機構が使用される。

割り込みと例外の処理には、

64

ビットモードのメカニズムが使用される。

システムコール(コールゲートを介した呼び出しと

SYSENTER/SYSEXIT)の処理

には、IA-32eモードのメカニズムが使用される。

1.6.4.

セグメント化

IA-32e

モードでは、セグメント化の影響は、プロセッサが互換モードで動作している

か、

64

ビットモードで動作しているかによって異なる。互換モードでは、セグメント 化は、従来の

16

ビットまたは

32

ビットの保護モードの仕組みを使用して、従来の

IA-32

モードと全く同じように機能する。

64

ビットモードでは、セグメント化は、全般に(ただし、完全にではなく)ディス エーブルになり、フラットな

64

ビットのリニアアドレス空間が構成される。厳密に は、

64

ビットモードでは、プロセッサは

CS

DS

ES

SS

のセグメント・ベースを

0

として扱い、実効アドレスに等しいリニアアドレスを作成する。ただし、

FS

セグメン トと

GS

セグメントは、この規則の例外である。これらのセグメントのセグメント・

レジスタ(セグメント・ベースを格納する)は、追加のベースレジスタとしてリニア アドレス計算に使用できる。これにより、ローカルデータとオペレーティング・シス テムの特定のデータ構造を簡単にアドレス指定できる。

なお、セグメント化が全般にディスエーブルになっていても、セグメント・レジスタ のロードにより、プロセッサにセグメント・アクセスの支援を実行できる。また、セ グメント・レジスタのロードでは、64ビットモードでは値が使用不可の場合でも、値

ドでのアプリケーションによる使用のために、

64

ビットモードでセグメント・レジス タに値をロードする場合があるからである。

1.6.4.1.

コード・セグメント

64

ビットモードでは、コード・セグメント(

CS

)ディスクリプタの一部の内容(例え ば、ベース・アドレス・フィールドとリミット・フィールド)は無視され、その他の フィールドは正常に機能する(ただし、タイプ・フィールドの読み取り可能ビットは 正常に機能しない可能性がある)。コード・セグメントは、

64

ビットモードでも存在 する。プロセッサの動作モードや実行の特権レベルを設定するには、コード・セグメ ントとそれに関連するディスクリプタおよびセレクタが必要である。コード・セグメ ントの動作モードと特権レベルは、ロング(

L

)、デフォルト・オペレーション・サイ ズ(

D

)、ディスクリプタ特権レベル(

DPL

)で指定する。

64

ビットモードのアドレス計算では、セグメント・ベースは0であるかのように扱わ

れる。

IA-32e

モードは、

CS

ディスクリプタ内の従来未使用のビットを使用する。ビッ

53

は、ロング(L)ビットとして定義され、IA-32eモードがアクティブ(IA32_

EFER.LMA = 1)になっているときの 64

ビットモードと互換モードの選択に使用され

る。

1-16.は、従来の CS

ディスクリプタに

L

ビットが追加された状態を示している。

CS

ディスクリプタの

D

ビットは、デフォルトのオペランド・サイズとアドレスサイズ を選択する。CS.Lビットが

1

の場合、CS.Dの有効な設定値は

0

だけである。この設定 値は、32ビットのデフォルト・オペランド・サイズと

64

ビットのデフォルト・アド レス・サイズに対応する。なお、

CS.L = 1

CS.D = 1

のビット組み合わせは、将来に 備えて予約されている。

IA-32e

モードで、これらのビットがセットされたコード・セ グメントを使用しようとすると、#GPフォルトが発生する。

IA-32e

モードがアクティブで

CS.L = 0

の場合は、プロセッサは互換モードで動作して いる。この場合、CS.Dは、レガシーモードと同じように、データとアドレス両方のデ フォルト・サイズを選択する。CS.D = 0の場合は、デフォルトのデータサイズとアド レスサイズは

16

ビットになる。CS.D = 1の場合は、32ビットのデフォルト・データ・

サイズとアドレスサイズが選択される。

表1-16. コード・セグメント・ディスクリプタ

ビット位置 DWオフ

セット

31:24 23 22 21 20 19:16 15 14:13 12 11:8 7:0

1 ベース

アドレス 31:24

G D L AVL セグメント・

リミット 19:16

P DPL 1 タイプ ベース アドレス 23:16 0 ベースアドレス15:0 セグメント・リミット15:0

関連したドキュメント