領域確保に悩まされた
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日)
この連載の記事
-
第803回
PC
トランジスタの当面の目標は電圧を0.3V未満に抑えつつ動作効率を5倍以上に引き上げること IEDM 2024レポート -
第802回
PC
16年間に渡り不可欠な存在であったISA Bus 消え去ったI/F史 -
第801回
PC
光インターコネクトで信号伝送の高速化を狙うインテル Hot Chips 2024で注目を浴びたオモシロCPU -
第800回
PC
プロセッサーから直接イーサネット信号を出せるBroadcomのCPO Hot Chips 2024で注目を浴びたオモシロCPU -
第799回
PC
世界最速に躍り出たスパコンEl Capitanはどうやって性能を改善したのか? 周波数は変えずにあるものを落とす -
第798回
PC
日本が開発したAIプロセッサーMN-Core 2 Hot Chips 2024で注目を浴びたオモシロCPU -
第797回
PC
わずか2年で完成させた韓国FuriosaAIのAIアクセラレーターRNGD Hot Chips 2024で注目を浴びたオモシロCPU -
第796回
PC
Metaが自社開発したAI推論用アクセラレーターMTIA v2 Hot Chips 2024で注目を浴びたオモシロCPU -
第795回
デジタル
AI性能を引き上げるInstinct MI325XとPensando Salina 400/Pollara 400がサーバーにインパクトをもたらす AMD CPUロードマップ -
第794回
デジタル
第5世代EPYCはMRDIMMをサポートしている? AMD CPUロードマップ -
第793回
PC
5nmの限界に早くもたどり着いてしまったWSE-3 Hot Chips 2024で注目を浴びたオモシロCPU - この連載の一覧へ