Expanded Memory Specification (EMS) の解説
Expanded Memory Specification (EMS) は、1980年代後半にロータス、
インテル、
マイクロソフトの3社によって提唱された、
MS-DOS環境下で1MBを超えるメモリ空間を利用するためのメモリ拡張規格です。LIM EMSとも呼ばれ、初期の
MS-DOSのメモリ制限を克服するための重要な技術でした。
初期の
MS-DOSはIntel 8086プロセッサ向けに設計されており、利用可能なメモリ空間は1MBに制限されていました。さらに、BIOSやビデオメモリなどが占有する領域を除くと、アプリケーションが利用できるメモリは640KB程度に制限されていました。このため、アプリケーションの規模が拡大するにつれて、メモリ不足の問題が深刻化していきました。
EMSによるメモリ拡張
80286や80386といった、より多くのメモリを扱えるプロセッサが登場しても、
MS-DOSはリアルモードで動作することが多く、1MB以上のメモリを直接利用することができませんでした。EMSはこの問題を解決するために開発された技術です。
EMSは、バンク切り換えという技術を用いて、1MBを超えるメモリ空間を16KBまたは64KB単位のページに分割し、必要に応じてアクセスする仕組みです。1MB以内の領域に「ページフレーム」と呼ばれる小さな領域を確保し、EMSマネージャが、利用したいページをこのページフレームに読み込むことで、仮想的に大きなメモリ空間を利用可能にしました。
EMSの種類
EMSの実装方法は大きく分けて3種類あります。
1. ハードウェアEMS
専用のメモリカードを拡張バスに接続することで、ハードウェア的にバンク切り換えを行う方法です。高速な処理が可能な一方、80286以降の
CPUではプロテクトメモリとしても使用できないという欠点がありました。そのため、両方の機能を利用したい場合は、別途プロテクトメモリも必要となり、二重投資になることもありました。
2. ソフトウェアEMS
80286以降の
CPUの機能を用いて、プロテクトメモリ上でEMSをエミュレートする方法です。プロテクトメモリからページフレームにページをコピーするオーバーヘッドがあるため、ハードウェアEMSに比べて低速でした。ただし、プロテクトメモリを他の用途に利用することもできる汎用性を持っていました。一部のEMSマネージャは、I/Oバンクメモリを利用して実装されているものもありました。また、補助
記憶装置上のファイルを用いてEMSをエミュレートする方式も存在しました。
3. 仮想86EMS
80386以降の
CPUの仮想86モードを利用してEMSを実現する方法です。高速で、汎用性が高いのが特徴です。ただし、仮想86モードは
プロテクトモードの一種であるため、
プロテクトモードで動作するプログラムと共存させるには、VCPIなどの規格への対応が必要でした。
Windows 9x系以前のWindowsでは、
MS-DOSモード用にEMM386.EXEが提供されていました。
EMSの設定
EMSを使用するには、ページフレームとなる64KBの連続した空き領域を確保する必要があります。この領域は、通常はBIOS、拡張カードのBIOS、ビデオメモリなどが占有している領域である「Upper Memory Area (UMA)」の一部を利用します。そのため、EMSを使用する際には、これらのデバイスとのアドレス競合を避けるための注意深い設定が必要でした。
ラージフレーム
PC/AT互換機|PC_AT互換機では、ページフレームをUMAだけでなく、コンベンショナルメモリの高アドレス領域にも配置する「ラージフレーム」方式が用いられることもありました。Windows 2.0やWindows 3.0では、この方式によりコンベンショナルメモリに常駐するDLLを切り替えることが可能になり、OS環境の快適性が向上しました。しかし、いくつかの欠点があったため、後に拡張メモリの標準はプロテクトメモリに移行していきました。
EMSの欠点
EMSは、いくつかの欠点も持っていました。
アドレス空間そのものを拡張するわけではないため、一度にアクセス可能なアドレス空間は1MBに制限される
プログラマはページフレームに存在するページを意識したプログラミングをしなければいけない
システム保護機能がなかったため、マルチタスク処理には向かない
DOSエクステンダなどに比べて低速
* 仮想86EMSはVCPIなどの規格に対応する必要がある
まとめ
EMSは、
MS-DOS環境下で1MBを超えるメモリを使用するための重要な技術でした。しかし、欠点もあったため、後にXMS(Extended Memory Specification)やDPMI(DOS Protected Mode Interface)などのより高度なメモリ管理技術に置き換えられていきました。しかし、初期の
MS-DOSアプリケーションのメモリ管理を理解する上で、EMSの知識は今でも重要です。