見出し画像

80286 - 仮想アドレスとメモリ保護

大型機やミニコンといったCPUであれば、前提条件として多くのプログラムを同時に動作させることを求められていたので、プログラムを格納する実際のアドレスは、その時のメモリの空き具合によって変えたくなるのが普通です。また部分的にディスクなどの高速な記憶装置をメモリの一部とみなすことにより、実際に搭載しているメモリよりも多くのメモリを持っているようにプログラムに思わせれば、デバイスなどの応答を待っているようなプログラムが使っているメモリをディスクなどに追い出して、効率的に実際のメモリを使うことが出来ます。

こんなことを出来るようにするために、実際にメモリを指すアドレスと、プログラムから見えるアドレスを区別する仮想アドレスという考え方が生まれました。

仮想記憶

マイコンの世界では、多くの場合は一度にひとつのプログラムしか走らせませんし、そもそもあまり多くのメモリも持たず高速な記憶装置も接続されていなかったので、物理的なアドレスをそのまま使うことしか出来なかったのですが、16ビットの世界が見えてきたあたりから、ミニコンなどで使われていた本格的なOSをサポートするためにも、仮想記憶を扱うことが必要になってきました。

この物理的なアドレスとプログラムから見えるアドレスを変換するための装置としてMMU(メモリ管理ユニット)が、それぞれのCPUに対して作られるようになりました。

メモリ管理ユニット

私が最初にほんの少しだけさわったのが、6809向けのMMUである6829で、64Kの物理アドレスしか扱えない6809のアドレス空間を変換することで最大で2Mものメモリを扱うことができるというものでした。プログラムごとにアドレス変換テーブルを設定して2Mの中のどの部分をCPUから見える64Kにするかを決めることが出来、これを使うことでOS/9といった本格的なOSをサポートできるようにしていました(OS/9はMMUを使わないバージョンの方がよく使われていましたが)。但し、あまりいろいろな機能はなく巨大なメモリバンク切り替え装置といったとことです。これを使うことでメモリアクセスに少しだけ時間がかかるようになりますし、テーブルの内容を書き換えてから反映されるまで少しばかり待ち時間が必要なので、手計算で余計な命令を挟んで待つ必要もあったりしました。

6829 - 6809用MMU

http://www.bitsavers.org/components/motorola/_dataSheets/6829.pdf

16ビットの時代になると、それぞれのCPUに対して当たり前のように MMU もリリースされるようになりました。68000に対しては68451が用意され、Z-8000に対しては、Z-8010がありました。

MC68000 MMU

Motorola 68451

Z8010_mmu Z8010 Mmu

ただいずれのMMUもOSが欲しい動作をさせるには少し無理があったようで、本格的に使われたものを見た覚えはありません。まだ大きなアドレス空間を必要とするほど大きなプログラムを走らせることも少なかったですし、CPUが充分に速いとは言えない時代に、メモリ保護ができるからと言ってアクセスが遅くなるのには耐えられなかったのかもしれません。

そのような中、インテルは8086に外付けのMMUを用意するのではなく、MMUを同じチップに収め、モードを切り替えることでMMUを有効にする80286をリリースしました。

Intel 80286

8080から8086に移行する時に導入したセグメントレジスタを単なるアドレス変換器ではなく、仮想アドレスへの変換に用いるという考え方は、もしかしたら当初から持っていたのかもしれません。リセット時はMMUが無効の状態(リアルモード)で、ここでMMUに必要なレジスタやテーブル類のセットアップを行ってからMMUを有効にする(プロテクトモードに入る)という手順で仮想アドレスが使えるようになります。プロテクトモードでは8086(およびリアルモード)では1Mしか使えなかったアドレスが16Mまで使えるようになり、既に逼迫していたメモリ空間が広げられることも期待されました。

ところがどっこい普及していたMS-DOSはリアルモードでしか動かすことが出来ず、プロテクトモードをサポートしたOSの普及を待つこととなりました。そのため当初は高速な8086としてしか使われず、ハードウェア的には1Mを超えたメモリを接続することができたものの、リアルモードではアクセスできないので、無用の長物と思われていました(搭載可能であっても1M以上のメモリを積む人はいなかった)。

プロテクトモードを活用すべく OS/2 であるとか XENIX が開発され、さらにはWindowsも3.0以降はプロテクトモードを使うようになりました。これらを動かすことができるハードウェアが増えてくると、MS-DOSにおいても1M以上のメモリを使いたくなります。まずリアルモードの微妙な仕様で1Mを超えた最初の64Kだけはなぜかリアルモードでアクセスする方法があります。これをHMAメモリと呼んでデバドラなどを置く場所として使われ始めました。またそれ以上のメモリもアクセスする時だけプロテクトモードに切り替えて使うXMSメモリという規格が整備されてRAMディスクなどに活用されるようになりました。

XMS

80286でもっとも頭が痛かったのが、いったんプロテクトモードになると、もうリアルモードに戻る方法が用意されていなかったことです。仕方がないので、リアルモードに戻りたいときには、ハードウェア的にリセットをかけて、電源投入時なのかプロテクトモードから戻りたいのかを外部の回路の助けを借りて判断して、モードをいったりきたりするようにして解決していました。これには結構な時間がかかるので頻繁に戻ることはできず、RAMディスクであればハードディスクよりは速いよねという程度の使い方が精一杯でした。

こういう事情もあったので、Windowsも286時代はMS-DOSのプログラムを呼び出すにもいろいろと制約があり使いやすいものではありませんでした。このためMS-DOSのアプリを使うには再起動してMS-DOSで動かしてしまうことも多く、いろいろな意味でなんとも中途半端な時代でした。

ただこういった試行錯誤の上で、16ビット時代にPCに求められる機能が整理され、インテルの8086系列とモトローラの68000系列が進化していき、残念ながらこの過程でZ8000は脱落することとなりました。そしてその先の32ビット時代が薄っすらと見えてきた時代です。

ヘッダ写真は、以下のものを加工して作成しました。

https://commons.wikimedia.org/wiki/File:KL_Intel_i286.jpg
Konstantin Lanzet (with permission) - CPU collection Konstantin Lanzet, received per EMailCamera: Canon EOS 400D, CC 表示-継承 3.0, https://commons.wikimedia.org/w/index.php?curid=4213086による

80286ハンドブック アスキー出版 ISBN4-87148-183-2 C3055 の表紙

#CPU #インテル #80286 #仮想アドレス #MMU #プロテクトモード #XMS

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