領域確保に悩まされた
MS-DOSのメインメモリー
QEMMはEMS/XMS/UMBと、後にはDPMI/VCPIのI/Fも搭載したメモリー管理ツールであるが、昔のユーザーはともかく昨今のユーザーはこれがなんのことかわからないと思うので、これを簡単に説明しておく。
下図が、非常に基本的なMS-DOSのメモリーマップである。一番下の0番地(00000H)から、IV(割り込みベクター)、一部BIOS(正確に書けばBIOSのエントリーポイント)、MS-DOS(IO.SYS&MS-DOS.SYS)とデバイスドライバー、COMMAND.COMの常駐部などがまずぎっちりロードされる。これがどの程度か、というのはロードするデバイスドライバーの利用量やMS-DOSのバージョンによっても変わってくる。
その上がプログラムエリアになっており、アプリケーションはこのエリアを利用して動くことになる。この上限はA0000Hで、仮にIVやBIOSが0だとすると、最大640KBが確保できることになるが、実際はこんなに取れることはなく、500KB台、下手をすると400KB台のことすらある。
A0000Hから上はハードウェアに割り当てられており、例えばビデオカードのフレームバッファなどがここに割り当てられている。あるいはBIOSの拡張部分や、通信ポートなどの追加ハードウェアもこのエリアを使う。
IBM-PCには関係ないが、日本のMS-DOSパソコンでは、このエリアに漢字ROMが割り当てられていたりした。この部分の上限がFFFFFHで、トータル1MBという形だ。
ところが80286になると、メモリー空間が16MBまで拡張された。ただ互換性を考えると、MS-DOS自身は最初の1MBしか利用できない。そこでこれを回避する方法として、従来のメモリー空間の中に16KB×4の、ページフレームと呼ばれる領域を設け、このページフレームに1MBより上のアドレスをマッピングするという方法が標準化された。
これがEMS(Expanded Memory Specification)である。プログラムはEMSのドライバーに対してリクエストを出すことで、ページフレームがマッピングするアドレスを入れ替えることが可能で、これによって最大15MBものメモリー領域を利用可能だった。
もっともEMSは、プログラムがメモリー管理を自分で行なわないといけない。あくまでもデータ領域として使えるだけで、プログラムの拡張には使えないなどいろいろ制限も多かった。
日本ではPC-9801向けであるが、EMSに対応したメモリーボードがメルコ(現バッファロー)やアイ・オー・データ機器から発売され、これを利用してRAMディスクを作り、ここにFDの内容をコピーして動かすことで処理が高速化される、という使い方がけっこう流行した。
次いで80386が登場すると80286よりもさらに機能が増えたため、これに対応したのがXMS(eXtended Memory Specification)である。XMSはHMA/UMA/EMBの3つの機能から構成される。
まずHMAであるが、これはちょっとしたトリックである。8086は16bitのCPUなので、内部のレジスターは16bit長だ。ところがメモリーアドレスは1MBなら20bitが必要になる。これを解決するのに、8086ではレジスターを20bit化するのでなく、セグメント+オフセット、という2つのレジスターの合計でアドレスを指定する方式になった。
この合計の方法が下図である。例えばセグメントが1234H、オフセットが5678Hならアドレスはこれを1桁ずらして加算することで、179B8Hになる。
これで20bit分のアドレスが利用できるわけだが、このやり方の場合、例えばセグメントがF000Hの場合、オフセットを0000H~FFFFHを可変にすることで、最大FFFFFH(=1MB)となるわけだが、もしセグメントをF000Hより大きくするとどうなるか? というと1MBを超えるアドレスにアクセスできる計算になる。
実際セグメントの最大値はFFFFHなので、オフセットもFFFFHの場合、アドレスは10FFEFHになる。8086/8088の場合は、物理的なアドレス線が20bit分しかないので、こうしたアクセスをすると一番上の1が省かれてFFEFHにアクセスすることになる(実際にはアクセスできない)のだが、80286以降では、これは正規(?)のメモリーにアクセスできることになる。
要するに1MBを超える領域に、63KB分ほど余分に利用できるメモリー領域ができた形だ。この領域をHMA(High Memory Area)と称する。実際80286でもここは利用できた。
また80386では、メモリーのマッピング領域を80286より細かく指定可能だったので、これを利用してA0000H~FFFFFHの本来システムで予約している領域の中で、実際には使われていない部分を全部メモリーに割り当てることが可能だった。これをUMA(Upper Memory Area)と呼ぶ。
ちなみに 最後がEMB(Extended Memory Block)で、これは先のEMSの図で言うところのEMSエリアに相当する領域である。ここを利用できるようにするのはEMSと同じだが、EMSと異なるのは直接DOSプログラムからアクセスする方法がないことだ。
この領域を利用するには2つの方法があり、XMSドライバ経由でEMBとプログラムエリアの間で内容のブロック転送を行なうか、DPMI(DOS Protected Mode Interface)を利用して、プロテクトモード(80286でサポートされた動作モード)を利用してプログラムを実行する、のどちらかだった。
当初こそブロック転送を利用するプログラムもあったが、途中からはDPMIを使うほうが普通だったと記憶している。
※お詫びと訂正:プロテクトモードの記述に一部誤りがありました。記事を訂正してお詫びします。(2017年4月19日)
この連載の記事
-
第768回
PC
AIアクセラレーター「Gaudi 3」の性能は前世代の2~4倍 インテル CPUロードマップ -
第767回
PC
Lunar LakeはWindows 12の要件である40TOPSを超えるNPU性能 インテル CPUロードマップ -
第766回
デジタル
Instinct MI300のI/OダイはXCDとCCDのどちらにも搭載できる驚きの構造 AMD GPUロードマップ -
第765回
PC
GB200 Grace Blackwell SuperchipのTDPは1200W NVIDIA GPUロードマップ -
第764回
PC
B100は1ダイあたりの性能がH100を下回るがAI性能はH100の5倍 NVIDIA GPUロードマップ -
第763回
PC
FDD/HDDをつなぐため急速に普及したSASI 消え去ったI/F史 -
第762回
PC
測定器やFDDなどどんな機器も接続できたGPIB 消え去ったI/F史 -
第761回
PC
Intel 14Aの量産は2年遅れの2028年? 半導体生産2位を目指すインテル インテル CPUロードマップ -
第760回
PC
14nmを再構築したIntel 12が2027年に登場すればおもしろいことになりそう インテル CPUロードマップ -
第759回
PC
プリンター接続で業界標準になったセントロニクスI/F 消え去ったI/F史 -
第758回
PC
モデムをつなぐのに必要だったRS-232-CというシリアルI/F 消え去ったI/F史 - この連載の一覧へ