プロテクトモード
出典: フリー百科事典『ウィキペディア(Wikipedia)』
プロテクトモードとはインテルのIntel 80286以降のCPUの命令セットアーキテクチャの動作モードの一つであり、これらのCPUの本来の動作モードといえる物である。
正式名称はProtected Virtual Address Mode(保護仮想アドレスモード)である。
特徴づけるものは、その名前の通り、階層的な特権管理(リングプロテクション)や、タスク間のメモリ保護(プロテクト)を行う事が可能な事である。
元々、Intel 8086においては、セグメント方式の仮想記憶を意識したセグメントレジスタという概念があり、コード、データおよびスタックの量がそれぞれ64キロバイト以内であれば、ロードされた物理アドレスを意識すること無く、タスクの実行が可能であったが、論理アドレスから物理アドレスへの変換は単純にセグメントレジスタを4ビットシフトして足すと言うもので、タスク間の保護もなかった。
プロテクトモードにおいては、メモリ上のグローバルディスクリプタテーブル(GDT)およびローカルディスクリプタテーブル(LDT)という構造体の配列をそれぞれ最大8192個管理する。この構造体はそれぞれ、リニアアドレスのポインタおよび大きさおよび保護情報を持つセグメントディスクリプタや、タスクセグメントへのポインタとサイズ、保護情報を持つタスクディスクリプタ、ローカルディスクリプタテーブルへのポインタを保持するもの、そして特権等を変更するための呼び先である、ゲートディスクリプタ等を持つ。セグメントレジスタはセレクタと呼ばれGDTまたはLDTのオフセットでセグメントディスクリプタを指すものとなる。無効なディスクリプタをセレクタにロードしたりすると例外を発生するようになった。タスクセグメントは、LDTを含むレジスタ等の実行環境を保持する。
特権は数字が低い程高い特権で0,1,2,3の4段階である。高い特権のコードへの呼出はゲートディスクリプタや例外を通す必要がある。
プロテクトメモリは、プロテクトモードを通して(XMS、EMSドライバ等により)アクセス可能な、物理アドレス100000h以降(1MB以降)のメモリの通称である。
[編集] 16ビットプロテクトモード
16ビットプロテクトモードにおいては24ビットの物理アドレス空間へのアクセス、そして1セグメントあたり最大64キロバイトの空間を提供していた。これまでに述べた機能を使ってセグメントレジスタを意識したセグメント方式の仮想記憶を使ったOS環境を作成することが可能になった。
保護された空間外へのメモリアクセスなどを行うと、たちどころに例外割り込みが発生して処理が停止する。80286 の 16bit PVAM において全ての保護違反例外はただひとつの割り込みベクタ…悪名高き「一般保護例外(General Protection Fault)」INT#13 に割り当てられており、一旦これが起きてしまうとそのプロセス(あるいはタスクまたはスレッド)の処理を復帰させる方法がない。すなわち外部記憶装置を持つ仮想記憶システムにおいてページ違反を例外処理として検出し、ページスワップを行ってからプロセスを再開させることができない(セグメントディスクリプタには「不在ビット」の属性があり、これを用いた仮想記憶管理を行うことは可能なのだが、メモリアクセス違反を流用した仮想記憶管理ができない)。これはそもそも Intel 社が 80286 を 80186 の上位機種であり「最高の信頼性を持つ制御用プロセッサ」として位置づけており、外部仮想記憶を持つような高度な処理は iAPX432 32bit プロセッサによって実現する構想を抱いていたことに起因する。80286 は工業用ミニコンピュータのアーキテクチャにならったもので、間違った前提のまま動き続けるよりは間違いを検出して止まったほうが被害が少ない、という思想に基づくものであった。
しかし Intel の思惑とは裏腹に、286 は汎用コンピュータである IBM PC/AT および PS/2 に搭載されてしまい、その上で汎用 OS である OS/2 を動かす必要に迫られ、286 は本来の設計思想とは異なる領域でアーキテクチャを無理にねじ曲げた使い方を強いられることになってしまい、「石頭」「こんだけ苦労してたった 16Mbyte」「しかも相変わらずセグメントあたり 64Kbyte の制限つき」「Brain Damaged CPU」などの悪名を高めてしまうことになる。
[編集] 32ビットプロテクトモード
Intel 80386以降で使用可能な、32ビットプロテクトモードにおいては、32ビットのリニアアドレス空間へのアクセス、1セグメントあたり最大4ギガバイトの空間を提供する上に、さらに物理アドレスへの変換にページテーブルを通すことが可能で、ページング方式の仮想記憶を使用することが可能になった。
1ページは基本的には4キロバイトであり、ページテーブルはプロセッサによって直接読まれるため構造が決まっている。構造はページテーブルの大きさも4キロバイトであり、基本的には一エントリあたり4バイトで、1024エントリを保持することになる。 これが2段で1024*1024*4096バイトの4ギガバイトの論理空間を全て指すことが可能になる。Pentium Pro以降に導入された物理アドレス拡張(PAE)が有効である場合は、一エントリあたりが8バイトとなり、もう一段4つのエントリを持つ32バイトのテーブルが追加される。これにより、64ビットの物理アドレス空間の任意のアドレスを4*512*512*4096バイトの32ビットの空間に配置することが可能になるが、実際の物理アドレス空間は36ビットが上限である。 このページエントリの構造は段数を増やしてAMD64でも継承されている。また、Pentiumからはページサイズ拡張 (PSE) という拡張により、一部のページを一段へらして4メガバイトの大きなページとしてマップすることが可能になっている。Pentium II以降においては、PAEでない通常のページテーブルエントリの構造を保ちながら4Mのページに限り36ビットの物理空間にアクセス可能な36ビットPSEとよばれる機能も提供している。
これにより、セグメンテーションを意識すること無くページングベースのOSを実装することが可能になっている。
また、仮想86モードは32ビットプロテクトモードの特殊なタスクの一つである。