ハイレゾモードとCPUのキャッシュ

 PC-98のハイレゾリューション(以下ハイレゾと略称)モードはとにかくCPUキャッシュと相性がよくありません。ハイレゾ機にはメモリウィンドウというバンク切り替え機構があることが理由です。メモリの内容がバンク切り替えにより違うものにすり替わると、キャッシュしているデータと一致しなくなってしまいます。このためメモリウィンドウの関係するところはキャッシュは禁止としなければなりません。

 ハイレゾ機のメモリウィンドウは リアルモードアドレスの80000h(512KB地点)から128KBの窓が2個、256KBぶんあります。初代機98XAではそこにはメモリの実体を置かず、物理アドレス100000h(1MB)以上のところに増設したメモリを128KB単位で80000hに写し出すという機構になっていました。1MBのメモリにリアルモードではアクセスできませんが、ウィンドウを通して読み書きはできるようにしたわけです。CPUキャッシュが無ければ、メモリバンクを切り替えても問題は起きません。

 当時としては意味があったメモリ機構ですが、80000h-BFFFFhの物理アドレスにもメモリが存在するようになってくると、有害無意味なものに成り下がりました。Microsoftが MS-DOS 3.3 で HIMEM.SYS を1MB以上のメモリドライバとして添付したときに、NECが初代機XAで設けたハイレゾ機の機構は破綻してしまうのです。 HIMEM.SYSでは1MBからの64KB(HMA)をリアルモードで使うわけですが、そこが80000hのところに持って行かれてしまうと具合がよくありません。

 さらにはLIM EMS 4.0 もハイレゾ機では実現が難しくなってしまいました。EMSは16KBページ単位でそれを4個連続させた64KBを基本とする仕組みですが、ハイレゾ機のメモリウィンドウはそれに対してサイズが大きすぎたのです。そこでNECは B0000h(704KB)からの64KBをEMSのための「窓」とすることにしましたが、窓と物理的記憶場所の間でデータ転送が必要となり、ページ切り替え型のハードウェアEMSとしては実現できませんでした(EMM.SYSのことを指す、他社はここをCバスメモリに位置づける機構を使ったEMSボードを一応出していた)。

 以上のことから、ハイレゾモードでは
(1) 80000h-BFFFFhはメモリウィンドウが動作する可能性があるとキャッシュ不可
(2) B0000h-BFFFFhはEMMが動作する可能性があるとキャッシュ不可
(3) B0000h-BFFFFhはDOSメモリ空間としてキャッシュ可能とする使い方もできる

という制約や不確定要素があることになります。

 このためキャッシュを安全かつ広い範囲に効かせようとすると大変です。起動のステージに合わせて、また最終的にOSのメモリマップに合わせてキャッシュ範囲をなんども変更して行かなければならないのです。

 ブートROM実行の段階では(1)にするしかありませんし、SYSTEM BIOSのエリアであるF0000h以上のところも合わせてキャッシュ不可にする必要があります。

 ディスクブートの段階つまりIPLwareでは少なくとも(1)です。なぜならこの後DOS起動までの間にメモリウィンドウの組み替えが起こるからです。DOSが起動しHIMEM.SYSが初期化作業を終えた後は(3)ですが、EMMの有無が確定するのはDOSのコマンドプロンプトに落ち着いた段階です。最適なキャッシュ設定をするためには、ここでももう1回キャッシュユーティリティが実行される必要があります。

 なおメモリウィンドウは1MB以上の窓として使われるだけでなく、SYSTEM BIOSのROMをコピーしたRAMの投影場所ともなっているため、メモリウィンドウを操作して 拡張BIOS, SYSTEM BIOSが現れるところもキャッシュしてはいけないと考えられます。したがってSASI,SCSI,SOUNDなどの内部BIOS ROM域は常にキャッシュ禁止にすべきですが、ROMがバンク切り替えを起こさないものについては、DOS起動後にはキャッシュ可にすると動作が速くなるメリットがあるかもしれません。

キャッシュとソフトCPUリセット

 キャッシュがあるCPUで困るのは、ソフトウェアCPUリセットです。これはハイレゾモードでなくても問題になります。ソフトウェアCPUリセットが発生するとCPUのキャッシュの設定も初期化され、全域でキャッシュ無効となってしまいます。これは不意にとか偶然起こるのではなく、プロテクトモードから復帰すれば80286では必ず発生します。しかもNECはプロテクトモードとリアルモードを行き来するプログラムに、互換性の意地(?)のためか、80386以上の機種であってもソフトリセットを使うという部分を残していたりします。実際80386以上のハイレゾモード機でもHIMEM.SYSの初期化動作時に必ずソフトリセットがかかります。これはほとんどバグとしか言いようがありません。ハイレゾモードであることはこの点で問題を大きくします。

 ソフトリセットは、純粋にリアルモードで動作している状態以外ではいつでも起こりうるものですし、DOS以外のOSの起動中、実行中も起こる可能性があります。

 ソフトリセットが起こるたびにキャッシュをもとの通りに再設定してくれるのはSYSTEM BIOS/ITF にあるソフトリセットからの復帰ルーチンです。そこにキャッシュをたたき起こすルーチンがあればよいわけです。しかし本体が知らないCPUアクセラレータに載せ替えた際にはそうは行きません。

 そこで一般にCPUキャッシュドライバは、RAM化されたSYTEM BIOSの当該部分を書き換えて、自身のCPUに適したキャッシュ再設定を行いますが、これは上記の(1)(2)(3)のステージごとに違うはずです。DOS以外のOSについてはまた独自に設定する必要があります。

キャッシュドライバは起動の段階毎に、OS毎に必要

 ということで、本来はCPUキャッシュドライバはOSが持つべきものだと言えます。ROMボード上のROMアプリケーションでは(1)の範囲に加えてSYSTEM BIOSエリア全域を禁止にしないとなりません。そのまま OS /アプリ までキャッシュが動作してくれるという保証はありません。MS-DOSでも起動が落ち着くまでの間にソフトCPUリセットがかかる可能性があります。実際 MS-DOS 6.20の EMM386.EXEをインストールするとソフトリセットが発生します。もしSYSTEM BIOSのリセット復帰ルーチンにキャッシュを起こすプログラムが埋め込まれていなければ、キャッシュ無効のままです。

 ということから、NEC純正以外の多くのEMM(仮想86マネージャ)では、よく知られたCPUアクセラレータのキャッシュドライバを内包しています。ただしそれが無条件で最適設定をしてくれるという保証はありません。

恨み節

 80386機のXL^2登場時点か HIMEM.SYS 登場の見通しがたった時点以降の機種から、あるいはせめて遅くとも i486 搭載機(A-mateのハイレゾ)の時点からメモリ機構を全面的に変更すればよかったのですが、それをしなかったために、さまざまな問題を抱えることとなりました。

 PC-H98model70や PC-9821An のようにL1,L2キャッシュの力で高速化した機種ほど、80000h-9FFFFhのエリアのメモリは相対的に遅くなってしまいます。メモリ書き込みではこれらの機種は PC-98RLよりも遅い(22MB/sec 以下)という事実は、驚くというより呆れるしかありません。昔のパソコン雑誌、「The BASIC」(1991) No.92 pp.80-81 にも「98RLより遅いH98」という記事があり、この問題を指摘している方がいらっしゃいました。

 まりも

[戻る]