16ビット時代のメモリ拡張の歴史(2) - XMSの登場
80286時代になり、CPU自身は16Mまでのメモリを扱えるようになり基板にも1Mを超えるメモリを挿せるようになりました。にも関わらずそこで動いているのはMS-DOSという8086時代のOSのままでした。8086として動いている限り1M以上のメモリがあっても、それを使うことが出来ないという悲しいことになりました。
もちろん80286でしか動かないプロテクトモードに対応したOS/2を導入し、MS-DOSプログラムはその中のDOS互換ボックスで使うことが出来なくはなかったのですが、互換性に問題があったり、何よりその動作速度が充分ではありませんでした。DOSエクステンダと呼ばれる複数のMS-DOS環境を切り替えて使うソフトも出るには出たのですが、多くのユーザは単に大きなメモリ空間が使いたかっただけで、そんな余分な機能を必要としていませんでした。
そこで、286の時代になっても86時代と同じハードウェアに依るバンク切り替え機能を持つEMSメモリボードを使う羽目になっていました。
16ビット時代のメモリ拡張の歴史(1) - EMS
さて、80286のリアルモードでの動作には少しばかり不思議な動作があることがわかりました。8086では16ビットの2つのレジスタを使って20ビットのアドレスを生成するのですが、この時の計算は4ビット左にシフトしたセグメントレジスタの値にアドレスとして使うレジスタの値を加えるというものです。ここでセグメントレジスタの値によっては当然繰り上がりが発生することはあるのですが、そもそもアドレス線が20本しかない8086では繰り上がりを無視した結果が使われるだけです。ところが80286では21本目(A20)があるので1Mを超えるアドレスを生成することが出来ます。
8086との互換性を考えれば繰り上がりが無視されることを前提としたコードがあるかもしれないので、この繰り上がりの扱いについては設定可能になっているハードウェアが多く、この設定のことを「A20ゲート」などと呼んでいます。
A20 line
gate A20
これが仕様なのかバグであるかの見方はいろいろあるようですが、このような動作をすることで80286ではリアルモードで使えるメモリが64K近く増えることになりました。
Intel 80286のA20マスクにまつわる話
この64Kをどう使うかは286時代は、いろいろなドライバがこっそり!?使うなどして混乱していたのですが、結局はMS-DOS自身がこれを使うようになりました。
ところでMS-DOSではアドレスの小さい方から(厳密には最も小さいアドレス付近はハードウェアが特定の目的で使用するので、その後ろから)システムプログラムが置かれ、その上の連続したアドレスをアプリケーションのプログラムやデータが使います。実際に使える大きさは搭載されているメモリ次第ですが、OSとしては640K(または768K)までを使うようになっています。この上のアドレスはVRAMであったりその他のハードウェア、そしてBIOSなどのシステムプログラムが使用します。これに加えて286以降では1Mを超えるアドレスも使えるようになったので、これらのアドレス空間に対して名前をつけて区別するようになりました。
XMS
1Mを超えたリアルモードからアクセスできる64KをHMA(High Memory Area)と呼び、その上のリアルモードからはアクセスできないアドレスをEMB (Extended Memory Block)とも呼びます(この名前はあまり耳慣れない)。これらを合わせて1Mを超えたアドレスをXMSと呼ぶことがあります。そしてI/ OやBIOSに割り当てられているアドレスにはUMB(Upper Memory Blocks)という名前をつけました。
CPUには1Mを超えたメモリを繋ぐことが出来るのであれば、わざわざバンク切り替えのハードウェアを使うこともありません。XMSメモリを使ってEMSと互換性のある動作をするソフトを用意すれば普通に追加のメモリを挿すだけでEMSメモリとしても使うことが出来るはずです。そこでいったんプロテクトモードに入りEMB領域にあるメモリをUMBにあるEMSのフレームアドレスの間にコピーしてからリセットをかけてリアルモードに戻るということを繰り返すことでEMSメモリを実現するようになりました。もちろんモードを行ったり来たりし、都度コピーをするのですから決して速いものではありませんが、それでもディスクに比べれば格段に速いです(※詳しくはわからないのですが、モードを行ったり来たりせずにコピーする方法もあったようです)。バンク切り替えとどちらが良いかといえば微妙なものもあり、拡張メモリカードにはバンク切り替えとXMSメモリのどちらでも使えるようなスイッチが付いていたり、EMMドライバが両方に対応していたりする高級品もあったようです(PC9801の場合)。
Expanded Memory Specification
技術/歴史/DOS時代のメモリ管理(EMS,XMS周辺)
パーソナルなコンピュータのメモリ事情 (第7回: 80286期)
そしてメモリに余裕があればRAMディスクとして利用する手もありました。8086時代からメモリの一部をRAMディスクとして使うドライバがありましたが、640Kの中から領域をひねり出すのでせいぜい128Kくらいまでのディスクとしてしか使えませんでした。これはこれで充分に便利だったのですが、一番RAMディスクに入れたかった日本語辞書には不足していました。286時代になりXMSをRAMディスクとして使うことの出来るドライバが登場し、今度は充分なサイズの領域を確保できるので便利に使うようになりました。もっともこの時代、ハードディスクを接続していることは少なく、まずフロッピーからRAMディスクにプログラムなりデータを読み込ませてフロッピーを差し替え、そのまま電源を切ると内容が消えてしまうので、電源を切る前には再びフロッピーを挿し込んで書き戻すという作業をして使っていました。それでも日本語変換の度にドライブから「カッチンカッチン」という音を聞かずにスムーズに変換できる幸せは代えがたいものでした。
Windowsの歴史、メモリの歴史(1)
286時代は普通はリアルモードしか使わないので、EMSにせよRAMディスクにせよ、このように限定された形でしかXMSメモリは使われませんでした。この時代のWindowsはバージョン2だったのですが、WindowsといってもDOSの上で動くアプリケーションでもあったので、プロテクトモードを使うわけでもなくHMAやEMSをゴリゴリ使って動かしていました。まあ使う人も殆どいなかったのですけどね。
Microsoft Windows 2.0
これが386の登場でXMSが使いやすくなり、MS-DOSの機能として標準化されもしたのですが、その使い方がなかなか複雑でカオスなことにもなっていきました。
ヘッダ画像は、以下のものを使わせていただきました。https://commons.wikimedia.org/wiki/File:IBM_PC_Memory_areas.svg
By Wtshymanski - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=21030868