検索に移動プロテクトモードとは、80286以降のx86アーキテクチャのCPUモードの一つ。Mode(保護仮想アドレスモード)である[1]。メモリやI/Oの保護を行うと共に、アドレス空間の拡張を行ったモードである。制御能力が向上するよう設計されている[2][3]。80286以降のCPUの命令セットアーキテクチャの動作モードの一つであり、これらのCPUの本来の動作モードといえる物である。特徴づけるものは、その名前の通り、階層的な特権管理(リングプロテクション)や、タスク間のメモリ保護(プロテクト)を行う事が可能な事である。プロテクトモードをサポートしているx86系プロセッサであっても、起動時のモードはリアルモードである[4]。「単に動作が高速であるというだけの、従来プロセッサ(すなわち、8086)」に見える。このことは、プロテクトモードに対応していない従来のOSをはじめとするシステムプログラムや、さらにはアプリケーションプログラムでも、そのまま新しいプロセッサを積んだマシンで使うことができる、という互換性を提供している[5]。ビットをセットする[6]。プロテクトモードの追加による機能向上によって広く採用され、同時にそれがその後のx86アーキテクチャの全ての強化の基礎となった[9]。いう構造体の配列をそれぞれ最大8192個管理する。この構造体はそれぞれ、リニアアドレスのポインタおよび大きさおよび保護情報を持つセグメントディスクリプタや、タスクセグメントへのポインタとサイズ、保護情報を持つタスクディスクリプタ、ローカルディスクリプタテーブルへのポインタを保持するもの、そしてコールゲートと呼ばれる特権等を変更するための呼び先である、ゲートディスクリプタ等を持つ。セグメントレジスタはセレクタと呼ばれGDTまたはLDTのオフセットでセグメントディスクリプタを指すものとなる。無効なディスクリプタをセレクタにロードしたりすると例外を発生するようになった。タスクセグメントは、LDTRを含むレジスタ等の実行環境を保持する。あるゲートディスクリプタの配列により設定されることになった。80286以降で物理メモリの拡張も行われたが、100000h以降(1MB以降)のアドレスの物理メモリは、HMAを除けばプロテクトモードを使用しない限り、CPUからはアクセスできない領域であった。そのため、この実質的にプロテクトモード専用の1MB以降の物理メモリ領域は通称プロテクトメモリと呼ばれた。プロテクトモードでは、コンベンショナルメモリ以外にプロテクトメモリも利用できるので、利用可能な物理メモリも増大した。この利用可能なメモリの増大もプロテクトモードを使用する利点の一つである。プロテクトメモリを利用するためには、本来UNIXやOS/2等のマルチタスクOSが必要であるが、MS-DOS上でもEMS・XMSドライバ、DOSエクステンダ等を使用すれば利用可能であった。本来の設計では、メモリアクセス用アドレスバスは20ビット幅だった[10]。バイト、すなわち1メガバイトのメモリにアクセス可能である[10]。周辺機器で使用する設計にした[12]。8086においては、セグメント方式の仮想記憶を意識したセグメントレジスタがあり、コード、データおよびスタックの量がそれぞれ64キロバイト以内であれば、ロードされた物理アドレスを意識すること無く、タスクの実行が可能であったが、論理アドレスから物理アドレスへの変換は単純にセグメントレジスタを4ビットシフトして足すと言うもので、タスク間の保護もなかった。メモリ価格が低下し、メモリ使用量が増えてくると、1MBという制約が大きな問題となってきた。リリースした[12]。最初に導入された80286においては24ビットの物理アドレス空間へのアクセス、そして1セグメントあたり最大64キロバイトの空間を提供していた。これまでに述べた機能を使ってセグメントレジスタを意識したセグメント方式の仮想記憶を使ったOS環境を作成することが可能になった。286リリース当時、プロテクトモードはすぐに広く使われたわけではない[12]。プロセッサをリセットする以外にリアルモードに戻ることができないため、BIOSまたはDOSコールにアクセスすることができないなどの欠点があり、幅広い採用が妨げられた[13]。4本のセグメントレジスタでそれぞれ16ビットのセグメントしかアクセスできなかった。バイト(256キロバイト)に限られていた[12]。互換性を保つため、起動時にはリアルモードで動作を開始するようになっていた[4]。修正せずに動作することができる。拡張機能にアクセスするには、オペレーティングシステムがプロセッサをプロテクトモードに移行させる必要がある。バイト(16メガバイト)のメモリにアクセス可能となる[10]。286のプロテクトモードではセグメントディスクリプタの「Presentビット」の属性を使用した仮想記憶管理が行われる。OSがセグメントの内容をハードディスクにスワップアウトすると、「Presentビット」を0にする。Present)」INT#11が発生する。OSはハードディスクからセグメントの内容をスワップインし、「Presentビット」を1にする。その後アプリケーションプログラムは実行を再開する。発生するが、OSやCPUは、アプリケーションプログラムが本来ロードしようとしていた正しい値がわからず、再実行ができない状態になる。80386では、セグメントリミットが4GBのフラットモデルを使用すれば、アプリケーションプログラムがセグメントレジスタのロードを行う必要はなくなる。プロテクトモードの採用を妨げていた様々な問題への対処が行われている[12]。バイト(4ギガバイト)のメモリにアクセス可能である[14]。セグメントも32ビットに拡大され、複数のセグメントを切り換えることなく4ギガバイトのアドレス空間にアクセス可能となった[14]。アドレスバスとセグメントレジスタの拡大に加えて、セキュリティと安定性を向上させるための様々な機能が追加されている[15]。Linuxなどほぼ全てのx86アーキテクチャ(IA-32)上のオペレーティングシステムで使われるようになった[16]。386のプロテクトモードで追加された機能[編集]386のリリースに際し、以下の機能がプロテクトモードに追加された[2]。仮想86モードプロテクトモードへの(からの)移行[編集]386がリリースされる以前は、プロテクトモードにいったん入った後、リアルモードに戻る直接的方法が提供されていなかった。IBMはその対処として、キーボードコントローラからCPUをリセットする技法を考案した。Areaに、リセット後の動作を決めるシャットダウンコードをリアルタイムクロック用の不揮発性CMOSメモリに、それ以外のプログラムの動作継続に必要な情報は当該プログラム自身のデータ領域などに保存するようにした。これによりBIOSがCPUをほぼ同じ状態に復旧することが可能となり、リセット前のコードの実行を続行できる。その後、トリプルフォールトを発生させて286CPUをリセットするという手段がとられた。こちらの方がキーボードコントローラを使うよりも高速できれいだった。プロテクトモードに入るには、少なくとも3エントリ(ヌルディスクリプタ、コードセグメントディスクリプタ、データセグメントディスクリプタ)を持つGDTを作る必要がある。アドレスバスのA20線(21番目のアドレス線)をイネーブルにし、1メガバイトを越えるメモリにアクセスできるようにする必要がある(電源投入直後は、古いソフトウェアの互換性を保証するため、20番目までのアドレス線しか使わない設定になっている)。命令を実行することで命令プリフェッチキューをクリアしなければならない。線をディセーブルし、CR0レジスタのPEビットをクリアすればよく、286で必要だった初期設定が不要になった。機能と特徴[編集]プロテクトモードには、セキュリティとシステム安定性を向上させるべくOSのアプリケーションに対する制御を強化するよう設計された機能がいくつかある[3]。それら追加機能により、適切なハードウェアサポートなしではかなり難しいか不可能であったOS機能の実装が可能になった[18]。この例ではOSが全リングを使用している。特権は数字が低い程高い特権で0,1,2,3の4段階の特権リングがある。リングの使用により、システムソフトウェアがタスクのデータやコールゲートへのアクセスまたは特権命令実行を制限できるようになった[19]。環境では、OSと一部のデバイスドライバがリング0で、アプリケーションがリング3で動作する[19]。高い特権のコードへの呼出はゲートディスクリプタや例外を通す必要がある。以下のような記述がある[20]。8086および80186のほとんどのアプリケーションプログラムに対して上方互換を保っている。8086のほとんどのアプリケーションプログラムは、80286上で再コンパイルまたは再アセンブルすることでプロテクトモードで実行可能である。」リアルモードのコードとのバイナリ互換性の観点で、アプリケーションプログラマにとって最も明白な変化は、物理メモリが最大16MBまでアクセス可能になった点と1GBの仮想記憶であった[21]。これには制限がなかったわけではなく、以下のような技法を使っていたアプリケーションはプロテクトモードでは動作しなかった[22]。特権命令を使用ハードウェアへの直接アクセスコードセグメントの書き換えデータの実行セグメントのオーバーラップインテルによって確保されているBIOS割り込みのためにBIOS関数を使用[23]実際にはほぼ全てのMS-DOSアプリケーションプログラムがこれらのルールのいずれかに反していた[24]。そのため、386では仮想86モードが導入された。リアルモードの各種アプリケーションをプロテクトモードで動作させるのに互換性を利用している[25]。呼ぶものを提供している。仮想86モードは8086向けのコードを修正することなく、プロテクトモードのOS上のタスクの1つとして安全に動作させることができる[26]。完全な後方互換性があるわけではない。セグメント操作や特権命令、ハードウェアへの直接アクセス、自己書き換えコードなどを使っているプログラムの場合、例外が発生するのでOSがそれに対処しなければならない[27]。関連命令を使用するとトラップ処理が行われるので、性能が低下する[28]。いった制約があるため、8086上のプログラムの一部は仮想86モードでは動作できない。結果としてシステムソフトウェアは、古いソフトウェアを扱う際にセキュリティか互換性のいずれかを犠牲にすることになった。互換性を犠牲にし、行儀の悪いDOSアプリケーションをサポートしなくなった[29]。セグメント方式[編集]80286の仮想セグメント「セグメント方式」も参照リアルモードでは、論理アドレスは2つの16ビットの部分で構成されており、論理アドレスが直接物理的メモリ位置に対応している。いう式で計算できる(アドレスバスのA20線がイネーブル状態の場合[30])。ビット15)がディスクリプタテーブル内のエントリのインデックスとなっている。1)は要求の特権レベルを定義しており、0から3までの値をとり、0が最も特権が高く、3が最も特権が低い。2)はGDTかLDTの指定に使われる。ディスクリプタテーブルのエントリには以下の情報が含まれる。セグメントの「リニア」アドレスセグメントの大きさを示すリミット値いくつかの属性ビット群(フラグ)286での特徴[編集]ディスクリプタテーブルのエントリ内のセグメントアドレスは24ビットであり、リアルモードとは異なり任意のアドレスからセグメントを開始できるようになった。バイトまで指定可能である。これに基づいて計算したリニアアドレスは物理メモリアドレスとなる。386での特徴[編集]ディスクリプタテーブルのエントリ内のセグメントアドレスは32ビットに拡張されている。リミット値は20ビット幅に拡張され、しかもG-ビットで倍率を指定できる。倍数で4096バイトから4ギガバイトまでとなる。ページングを使わない場合、リニアアドレスはそのまま物理メモリアドレスとなるが、ページングを使う場合はリニアアドレスはページング機構への入力となる。386プロセッサではアドレスオフセットとしても32ビットの値を使用する。286のプロテクトモードとの互換性を維持するため、D-ビットが追加されている。D-ビットがオフとなっているコードセグメントは16ビット・セグメントと解釈され、その中の命令は16ビット命令として実行される。AVLビットは未使用でありOSで使用可能である。「ページング方式」も参照386では仮想86モードだけでなく、ページング方式がプロテクトモードに追加された[31]。ページングを使うことでシステムソフトウェアはページと呼ばれるメモリ単位毎にタスクのアクセスを制限し制御することができる。多くのOSでページングを使ってタスク毎の仮想アドレス空間を作成している。それによって、あるタスクが他のタスクのメモリを操作することを防ぐ。ページ単位で主記憶装置からより低速だが大容量の補助記憶装置(ハードディスクなど)へ移すこともできる[32]。それにより、主記憶装置の物理メモリ量以上のメモリを使用可能となる[32]。x86アーキテクチャではページの制御をページディレクトリとページテーブルという2段階の配列で行う。1ページは基本的には4キロバイトであり、ページテーブルはプロセッサによって直接読まれるため構造が決まっている。そこに格納されていた。PDEにはページテーブルへのポインタが含まれている。PTEには実際の物理ページのアドレス(ポインタ)が含まれており、その場合の各ページは4キロバイトである。これで1024×1024×4096バイト、すなわち4GBの論理空間を全て指すことが可能になる。Pro以降に導入された物理アドレス拡張(PAE)が有効である場合は、一エントリあたりが8バイトとなり、もう一段4つのエントリを持つ32バイトのテーブルが追加される。これにより、64ビットの物理アドレス空間の任意のアドレスを4×512×512×4096バイトの32ビットの空間に配置することが可能になるが、実際の物理アドレス空間はもっと少ない。このページエントリの構造は段数を増やしてAMD64でも継承されている。いう拡張により、一部のページを一段へらして4メガバイト(PAEの時は2メガバイト)の大きなページとしてマップすることが可能になっている。II以降においては、PAEでない通常のページテーブルエントリの構造を保ちながら4MBのページに限り36ビットの物理空間にアクセス可能な36ビットPSEとよばれる機能も提供している。より、x86アーキテクチャでプリエンプティブマルチタスクが可能となった。TSSにより、他のタスクに影響を及ぼすことなく汎用レジスタ群、セグメントセレクタフィールド群、スタック群を書き換え可能となった。TSSはまた、タスク毎に特権レベルやI/Oポート許可マップを設定できる。多くのOSはTSSの全機能を使ってはいない[34]。これは移植性を考慮したためでもあるし、ハードウェアによるタスク切り替えが性能問題を抱えているためでもある[34]。結果として多くのOSはハードウェアとソフトウェアを共に活用してマルチタスクを実現している[35]。2007年7月14日閲覧。2007年7月14日閲覧。3では)、ブートローダーに制御が移る時点でプロテクトモードに移行している。2009年7月31日閲覧。2008年3月22日時点のオリジナルよりアーカイブ。2007年7月14日閲覧。2007年7月24日閲覧。2008年1月15日時点のオリジナルよりアーカイブ。2007年7月24日閲覧。2007年7月24日閲覧。2007年7月24日閲覧。2007年7月25日閲覧。2002年10月3日時点のオリジナルよりアーカイブ。2007年7月25日閲覧。2002年10月3日時点のオリジナルよりアーカイブ。2007年7月25日閲覧。2002年10月3日時点のオリジナルよりアーカイブ。2007年7月25日閲覧。2007年7月29日閲覧。2007年7月29日閲覧。当初の上限は36ビット、x64命令セットをサポートしている場合は52ビット。2007年2月12日時点のオリジナルよりアーカイブ。2007年7月29日閲覧。2007年2月12日時点のオリジナルよりアーカイブ。2007年7月29日閲覧。(日時は個人設定で未設定ならばUTC)。表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。Cookieに関する声明モバイルビュ。