見出し画像

プロテクトモード - 仮想アドレスとメモリ保護

8ビットCPUな時代、ミニコンなどと比べてマイコンで出来ないこととして、仮想アドレスとメモリ保護がないという問題がありました。仮想アドレスといのは、メモリ素子と物理的に接続されているアドレス線をそのままソフトウェアから見えるメモリアドレスとして使うのではなく、何らかのテーブルなどを使って変換して使えるようにする仕組みで、テーブルを切り替えることによって、同じ物理的なアドレスにあるプログラムやデータを異なるアドレスとして扱うことが出来るようになります。

リロケータブルとバイナリローダ - 絶対アドレスの扱い

この仕組みを使うことで、実際に異なる物理アドレスのメモリに置かれた複数のプログラムを、あたかも同じアドレスから始まるように動かすことが出来るので、プログラム自身をリロケータブルにすることなく絶対アドレスで書かれていても大丈夫になるという便利な仕組みです。

この仕組みの副産物として、プログラムから見えるアドレスが必ずしも実際のメモリを指すわけではなく、実はディスク上に置かれていたり、必要になってから割り当てるということも出来るようになります。

仮想記憶

こういった仕組みはOSを書くような人には、とても大切ですが、プログラムを書く立場から見れば、コードから見えるのは仮想アドレスであって、それが物理的にどのアドレスにあたるのかは意識する必要はありません。例外的にデバイスドライバなどハードウェアのアドレスを必要とするときのみ、顔を出すことがあります。

別にCPUがひとつのプログラムしか動かさないのであれば、こんな仕組みはいりません。ただ複数のプログラムを動かそうとすれば、プログラム毎のアドレスを調整したり、あるプログラムが他のプログラムが使っている領域を書き換えたりできてしまうと、そのプログラムには何の問題も無いのに正しく動かなくなってしまうので、プログラムごとにアドレス空間を仕切って、他にプログラムが使っているメモリを触れないようにする(もしくは見えないようにする)ことが大切になります。こうしてプログラムごとにプロセスという単位を作って、複数のプログラムを管理するようになります。まあ、このプロセスを管理する仕組みこそがOSだったりするのですが。

その意味ではCP/MやMS-DOSといったDOSは原則として、ひとつのプログラムしか動かせませんし、厳密な意味ではOSとは言えないので、なんちゃってOSとも言えるもので、ちゃんとプロセスを管理するようなOSこそ本物のOSなわけです。

8ビットな時代には、複数のプログラムを同時に動かす(マルチタスク)には、CPUの処理能力も充分ではありませんでしたし扱えるメモリも足りませんでした。もちろん組み込みなどでは、そのような用途もあり専用のOSは用意されていたものの一般的ではありません。どうしても必要な場合には外付けのメモリ管理ユニットというチップを使って、仮想アドレスを使えるようにする方法はありました。

メモリ管理ユニット

最初にMMUを覚えたのは6809向けの6829で、残念ながら実際のチップは見たことが無かったのですが、ここでメモリ管理とは何かというのを覚えました。

MC6829 Memory Management Unit (Motorola)

https://colorcomputerarchive.com/repo/Documents/Datasheets/MC6829 Memory Management Unit (Motorola).pdf

6809は完全なリロケータブルなコードを書くことが出来る命令セットを持っていたので、MMUを使わなくても好きな実アドレスでプログラムを走らせることが出来るのでOS-9は、それを活かした本格的なOSになっています(MMUを使うLevel2もあります)。

この時代のCPUであるZ-8000(Z-8010)やMC68000(MC68451)に対してもMMUは用意されていたのですが、対応するOSがメジャーなものでは無かったですし、複雑な外付け回路と多少のパフォーマンスの低下もあったので、使われた例は少なかったです。それに対しインテルは80286で8086時代から使われてきたセグメントレジスタを再定義して、プロテクト・モードという名前のMMUに相当する機能を内蔵したために、これを活用しようとするOSがいくつも登場しました(OS-2やXENIXなど)。

ちなみにメモリ保護というのは、この仮想アドレスのメモリに対して、それぞれ読む書く実行することを制限する機能で、この機能を活用することでデータを読み出し専用にしたり、データ領域にあるプログラムを実行したり出来ないようにするのですが、今までどのアドレスに対しても自由に読み書き出来た世界との互換性を保つために、なかなか思ったように活用できないこともシバシバでした。

Windowsはもともと仮想メモリを持たない8086に対するOSだったので、DOSの延長線上で他のプログラムのデータを好き勝手に触ることが出来たのですが、バージョンが上がるにつれ、少しずつ進化して、いつのまにやらマトモなOSとしての機能を備えるようになりました。

ここまで来ても結局、仮想アドレスが何なのかわかりにくいとは思うので、幾つか参考になる記事を貼っておきます。

コラム:Windowsの歴史、メモリの歴史(1)

Windowsのメモリー管理をx86の仕組みから読み解く

物理アドレス空間と仮想アドレス空間の違いとその基礎知識

まあ、他にもスワッピングとページングとか、特権命令であるとか、OSごとにどのようにメモリを管理しているのかなどもあるのですが、その辺りはまたの機会にまとめてみるつもりです。

ヘッダ画像は、以下のものを使わせていただきました。https://commons.wikimedia.org/wiki/File:Virtual_memory_ja.svg
Akabe - 投稿者自身による著作物, パブリック・ドメイン, https://commons.wikimedia.org/w/index.php?curid=12003101による

#仮想アドレス #メモリ保護 #MMU #メモリ管理ユニット #6829 #Z8010 #68451 #80286 #プロテクトモード

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