プロテクトメモリ
[Wikipedia|▼Menu]

プロテクトモードとは、80286以降のx86アーキテクチャのCPUモードの一つ。正式名称は Protected Virtual Address Mode(保護仮想アドレスモード)である[1]。メモリやI/Oの保護を行うと共に、アドレス空間の拡張を行ったモードである。このモードでは仮想記憶ページング、安全なマルチタスクといった機能をシステムソフトウェアが使えるようになり、アプリケーションソフトウェアへのオペレーティングシステム (OS) の制御能力が向上するよう設計されている[2][3]
概要

プロテクトモードとはIntel 80286以降のCPUの命令セットアーキテクチャの動作モードの一つであり、これらのCPUの本来の動作モードといえる物である。特徴づけるものは、その名前の通り、階層的な特権管理(リングプロテクション)や、タスク間のメモリ保護(プロテクト)を行う事が可能な事である。

プロテクトモードをサポートしているx86系プロセッサであっても、起動時のモードはリアルモードである[4]。つまり、「単に動作が高速であるというだけの、従来プロセッサ(すなわち、8086)」に見える。このことは、プロテクトモードに対応していない従来のOSをはじめとするシステムプログラムや、さらにはアプリケーションプログラムでも、そのまま新しいプロセッサを積んだマシンで使うことができる、という互換性を提供している[5]。プロテクトモードに移行するには、いくつかのディスクリプタテーブルを設定してから、コントロールレジスタ0 (CR0) のPE (Protection Enable) ビットをセットする[6]

プロテクトモードは1982年、インテル80286 (286) プロセッサのリリースと共にx86アーキテクチャに追加され[7]、1985年の 80386 (386) で拡張された[8]。プロテクトモードの追加による機能向上によって広く採用され、同時にそれがその後のx86アーキテクチャの全ての強化の基礎となった[9]

プロテクトモードにおいては、メモリ上のグローバルディスクリプタテーブル (GDT) およびローカルディスクリプタテーブル (LDT) という構造体の配列をそれぞれ最大8192個管理する。この構造体はそれぞれ、リニアアドレスのポインタおよび大きさおよび保護情報を持つセグメントディスクリプタや、タスクセグメントへのポインタとサイズ、保護情報を持つタスクディスクリプタ、ローカルディスクリプタテーブルへのポインタを保持するもの、そしてコールゲートと呼ばれる特権等を変更するための呼び先である、ゲートディスクリプタ等を持つ。セグメントレジスタはセレクタと呼ばれGDTまたはLDTのオフセットでセグメントディスクリプタを指すものとなる。無効なディスクリプタをセレクタにロードしたりすると例外を発生するようになった。タスクセグメントは、LDTRを含むレジスタ等の実行環境を保持する。

また、割り込み/例外ベクタも、最低位アドレスに固定されることなく、割り込みディスクリプタテーブル (IDT) にあるゲートディスクリプタの配列により設定されることになった。

80286以降で物理メモリの拡張も行われたが、100000h以降(1MB以降)のアドレスの物理メモリは、HMAを除けばプロテクトモードを使用しない限り、CPUからはアクセスできない領域であった。そのため、この実質的にプロテクトモード専用の1MB以降の物理メモリ領域は通称プロテクトメモリと呼ばれた(Extended Memory)。プロテクトモードでは、コンベンショナルメモリ以外にプロテクトメモリも利用できるので、利用可能な物理メモリも増大した。この利用可能なメモリの増大もプロテクトモードを使用する利点の一つである。プロテクトメモリを利用するためには、本来UNIXOS/2等のマルチタスクOSが必要であるが、MS-DOS上でもEMSXMSドライバ、DOSエクステンダ等を使用すれば利用可能であった。
歴史

286に先立つ Intel 8086 での本来の設計では、メモリアクセス用アドレスバスは20ビット幅だった[10]。これにより 220 バイト、すなわち1メガバイトのメモリにアクセス可能である[10]。当時は1メガバイトといえばかなり大容量のメモリという感覚だったので[11]IBM PC の設計者らは先頭640キロバイトをアプリケーションとオペレーティングシステムで使用し、残る384キロバイトBIOS (Basic Input/Output System) や周辺機器で使用する設計にした[12]

元々、8086においては、セグメント方式仮想記憶を意識したセグメントレジスタがあり、コード、データおよびスタックの量がそれぞれ64キロバイト以内であれば、ロードされた物理アドレスを意識すること無く、タスクの実行が可能であったが、論理アドレスから物理アドレスへの変換は単純にセグメントレジスタを4ビットシフトして足すと言うもので、タスク間の保護もなかった。

メモリ価格が低下し、メモリ使用量が増えてくると、1MBという制約が大きな問題となってきた。インテルはこの制限に対処するためもあって 286 をリリースした[12]
286におけるプロテクトモード「Intel 80286」も参照

最初に導入された80286においては24ビットの物理アドレス空間へのアクセス、そして1セグメントあたり最大64キロバイトの空間を提供していた。これまでに述べた機能を使ってセグメントレジスタを意識したセグメント方式の仮想記憶を使ったOS環境を作成することが可能になった。しかし286リリース当時、プロテクトモードはすぐに広く使われたわけではない[12]。プロセッサをリセットする以外にリアルモードに戻ることができないため、BIOSまたはDOSコールにアクセスすることができないなどの欠点があり、幅広い採用が妨げられた[13]。幅広い採用が見送られた他の要因として、286 では4本のセグメントレジスタでそれぞれ16ビットのセグメントしかアクセスできなかった。すなわち一度にアクセスできるメモリの範囲は 4*216 バイト(256キロバイト)に限られていた[12]

286 は 8086 との互換性を保つため、起動時にはリアルモードで動作を開始するようになっていた[4]。リアルモードでは 8086 と全く同じ動作をするので、古いソフトウェアも 286 で修正せずに動作することができる。286 の拡張機能にアクセスするには、オペレーティングシステムがプロセッサをプロテクトモードに移行させる必要がある。それによって24ビット・アドレッシングが可能になり、224 バイト(16メガバイト)のメモリにアクセス可能となる[10]

286のプロテクトモードではセグメントディスクリプタの「Presentビット」の属性を使用した仮想記憶管理が行われる。OSがセグメントの内容をハードディスクにスワップアウトすると、「Presentビット」を0にする。アプリケーションプログラムがこのセグメントの値をセグメントレジスタにロードすると「セグメント不在例外(Not Present)」INT#11が発生する。OSはハードディスクからセグメントの内容をスワップインし、「Presentビット」を1にする。その後アプリケーションプログラムは実行を再開する。

プロテクトモードではプログラムのバグによってプロテクトモードのルールに反する不正な値をセグメントレジスタにロードした場合「一般保護例外 (General Protetion Fault)」INT#13 が発生するが、OSやCPUは、アプリケーションプログラムが本来ロードしようとしていた正しい値がわからず、再実行ができない状態になる。

80386では、セグメントリミットが4GBのフラットモデルを使用すれば、アプリケーションプログラムがセグメントレジスタのロードを行う必要はなくなる。
386のプロテクトモードIntel 80386 マイクロプロセッサ「Intel 80386」も参照

1985年[8]にリリースされた 386 では、プロテクトモードの採用を妨げていた様々な問題への対処が行われている[12]。386のアドレスバスは32ビット幅で、232 バイト(4ギガバイト)のメモリにアクセス可能である[14]。セグメントも32ビットに拡大され、複数のセグメントを切り換えることなく4ギガバイトのアドレス空間にアクセス可能となった[14]


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:66 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef