見出し画像

286のプロテクトモード - 仮想アドレス

80286で登場したプロテクトモードですが、今までのCPUと比べると、メインフレームにしか無かったような仮想アドレスであるとか、メモリ保護といった高度な機能が実装され、本格的なOSが要求する機能が揃うことになりました。一般的なアプリケーションからすれば、これらの機能はあくまで裏方であって、プログラムを作るうえでも普通は知る必要はありません。

今回はその中で仮想アドレスの仕組みが286で、どのように働くかを説明してみます。80286の先祖でもある8086と80286がリセット時に動作するリアルモードに置いては、以下の記事に書いたようにセグメントレジスタの値を組み合わせて2つの16ビットレジスタから20ビットのアドレスを生成して動作します。

8086のセグメントレジスタとメモリモデル

286では、このリアルモードでいろいろな下準備をしたうえでプロテクトモードに移行します。プロテクトモードになるとセグメントレジスタの値は上位アドレスを意味するのではなく、実アドレスが書いてあるメモリに対するセレクタとして機能します。

実アドレスの算出手順

セレクタはマッピングテーブルへのインデックスとして働き、このテーブルに書いてあるベースアドレスにIPなどのレジスタの値を加えたものが24ビットの実アドレスになります。もっとも16ビットあるセレクタの値のうち、インデックスとして使われるのは上位13ビット分で、これで8192種類のセグメントを持つことが出来るわけです。従って仮想アドレス空間としては13+16の29ビット512Mの広さがあるとも言えます。このマッピングテーブル自体は複数持つことができて、普通はOS(グローバル)と、それぞれのタスク(ローカル)毎に持っています。

セレクタの上位13ビットがインデックスとして使われる

そしてマッピングテーブルは、セレクタひとつあたり8バイトを持っており、ここにはベースとなる実アドレス24ビットと、そのセグメントとしてアクセスできるサイズ16ビット、そしていくつかのフラグからなります。有効なセレクタの数は8Kなのでひとつのテーブルの大きさは64Kですね。ここでリミットがあるのはセグメントごとに必ずしも64Kの実アドレスが割り振られるのではなく、その一部だけが使えるようにするためです。リアルモードと違い、ここでリミットを超えたオフセットでアクセスすると例外が発生します。

テーブルの内容

Protected Mode Memory Addressing

フラグの中にあるPフラグは、この実アドレスが有効かどうかを示すもので、ここが無効であると割り込みが発生します。つまり仮想アドレスとしては存在するのですが、実メモリに存在していないのです。これを使って実際に搭載している大きさを超えたメモリを扱うことができるようになります。またAフラグは、このセレクタをアクセスしたことを記録するフラグです。このフラグを一定時間ごとにクリアすることで、アクセスされていないセレクタ値を知ることができます。

プログラムが使うメモリが増えて、そのすべてを実メモリの収めることができなくなると、Aフラグを調べてアクセスされていない実メモリの内容をディスクなどに退避してPフラグを無効にすることで、実メモリに空きを作ることができるようになるのです。そしてこのセレクタがアクセスされると、今度はPフラグが無効になっていることで割り込みが発生します。この割り込み処理で退避したメモリの内容を書き戻して有効にすることで、あたかもずっとメモリにイたかのように振る舞うのです。これを「スワッピング」呼びます。スワッピングで入れ替えるメモリの単位はリミットで示された大きさ(最大64K)になります。

プロテクトモード

Operating Systems/Build Your Own OS/Protected Mode Tutorial.txt

なおメモリをアクセスするたびにマッピングテーブルの内容を参照するのは大変なので、セレクタが指しているテーブルの内容は隠れたレジスタにキャッシュされています。

ということで、どうやってセレクタとレジスタの値から24ビットの実アドレスを作り出しているかと、仮想アドレスを使うことで、実際に存在する以上のメモリを使えるようにする仕組みが見えてきたでしょうか?

メモリというのは、使っていればもっと必要になったり、もう使い終わったので不要になるということを繰り返すものです。新しいセレクタを用意したり不要なセレクタを返却したり、それぞれのリミットを変更したりすることを繰り返します。このために必要な設定もあるのですが、ここまでにしておきましょう。

プロテクトモードの機能としては、他にもメモリ保護であるとか、タスクの切り替えというものもあるのですが、ユーザが使うプログラムから意識することとしては、8086と違って確保した大きさを超えるメモリをアクセスすると割り込みが発生してしまうということくらいでしょうか。またレジスタに書いてあるアドレスと実際のメモリ上のアドレスの関係は複雑な手順で変換された結果であり、OSによってディスクに追い出されたり戻されたり、再配置されたりするものなので、特別な理由がない限り知る必要もないというものです。

なお、MS-DOSはリアルモードでしか動作せず、どんなにメモリを搭載していても20ビット分(1M)しかアクセスできないので、プロテクトモードを限定的に利用して、より多くのメモリを扱えるようにする機構がありました。それについてもまたの機会に。

ヘッダ画像は、以下のものを使わせていただきました。
https://commons.wikimedia.org/wiki/File:Protected_mode_segments.svg
By John Källén (jkl at commons) - Own work, Public Domain, https://commons.wikimedia.org/w/index.php?curid=1754389

#CPU #80286 #プロテクトモード #仮想アドレス #セレクタ #アドレス変換 #スワップ

この記事が気に入ったらサポートをしてみませんか?