第12回・ECCメモリ要求マシンに非ECCのメモリをつける!

98のカタログスペックを見たことがあるだろうか?
メモリの欄に、「ECC対応」(※1)と書かれているあれである。
実はこれ、「ECCにも対応」ではなくて、「ECCのみ対応」の意味なのである!(※2)

そして、ECCメモリの値段は非常に高く、128MB(64MB*2枚)NEC純正などを買おうものなら、
480000円(※3)という値段である。

そこで、この問題を何とかすべく、ECCではなく、ただのEDOメモリを取り付けることができないかと、
ITFHackerを再び起動させたのである。
時に西暦1999年3月26日、雨の降る夜のことであった。

で、結論から言ってしまうと、

のように見事に認識している。

ここで、エラーを出さないようにするには、手段が3つある。
1.ECCメモリを素直につける。
2.NMI(※4)をブロックする。
3.PCIチップセットの設定で、ECCメモリを使用しないに設定する。

1番は、言うまでもないが、そのような経済力がある人ならば迷わず選択すべきである。

2番は、一部の機種では有効であるが、ソフトウェア電源スイッチ搭載マシンでは、電源スイッチの管理は
NMI割り込みで処理されており、この部分をブロック(※5)してしまうと、まずいことになりそうである。

3番は、起動時にメニューでその項目があればいいのだが、もちろんそんな設定はないので、起動後に設定する
しかないのであるが、起動中にエラーでとまるので、もちろん無理である。
が、ちょうどいいことにこのマシンは、ITFが書き換え可能ではないか!
そこで、この方法で起動中にECC設定を行っている部分を書き換えてしまうことにする。

440FXのデータシートをダウンロードしてきて、メモリ関係の部分を調べてみる。
レジスタ50h番がECC関連の設定であることがわかった。
さっそく通常状態で、調べてみると、30h、つまり
ECC Checking/Generation Enabled and Correction Enabled
となっている。
ECCを有功にしてエラー訂正を有効にする設定である。
この部分を、DOS上で、通常処理(00h)にしてみると、問題なく動作している。

これで問題ないということは、ただ単純にITFの中で30hに設定している部分を見つけ出して、
そこを何とかしてやればOKだということである。

そこで、PCIレジスタの設定を行っている部分を探してみると、1個所、ばっちり書かれている。
以下のようなルーチンだ。(PCIレジスタのコントロール方法については、OPENDESIGN7号を参照のこと)

mov dx,0cf8h
mov eax,80000050h
out dx,eax
mov dx,0cfch
in al,dx
or al,30h
out dx,al

もろに、30hを設定していることがわかる。
で、ここを00hにしてみた。(アドレスは、F8000:4891h)

起動・・・問題なくWindowsが起動した。現在のこの文章はそのマシンで書き込みしている。
これで、安いただのEDOメモリが使用できるようになった。
(チェックには、Xa13/Kマシンにつけていた、EDOメモリを使用した。(FP動作なのだが、EDOのほうが安かったからである)
 後に、64M EDOと堂々と書かれたチップの載った64MByteEDOSIMM2枚を
 搭載して確認)


これで、大容量のメモリをつけることができるのだが、
大容量のメモリを搭載したときに、Mate−Rでは大問題が発生するのだ。
それは、
メモリチェックがやたらと遅い
ということである。(Mate−Rは信頼性のためメモリチェックが遅い。らしい)
次回は、この問題を解決すべく、
メモリチェックを怪速(誤字ではない^^)にする!
を予定している。


※1
ECCとは、エラーコレクトコーデックのことで、ある一定のビットまでのエラーを訂正できる偉いメモリのことなのだ。
(一般的に売られているメモリモジュールでは、メモリチップ自体に訂正機能がついているわけではない。
そういう構成で利用できるように、チップを構成して配線されているメモリである。念のため)
この他に、パリティ付きメモリというものがあるが、結局エラーが検出できるというだけで、エラーが起これば
使用できないという迷惑なメモリである。
EDOメモリには、パリティ構成というのは非常に少なく、なぜかただのEDOとECC構成のものしか一般的に見かけない。
ちなみに、このエラー訂正は、サーバーなどの機器における信頼性の計算を行うときに貢献するものであって、
一般的なユーザーには関係がない。エラーが起きるようなメモリなど、使うべきではないからである。

※2
最初にこれを知らなくて、ただのEDOをつけたときに非常に激しいエラーが発生したのを見たことがある。
あれはすごかった。

※3
これは、一番最初のときのお値段。価格改定して、240000円になった。
しかし高い。
まあ、どこぞで安売りしていたりすることもあるらしいし、中古で安く出ていることもあるそうだ

※4
NMI=ノンマスカブルインタラプトのこと。
無視することのできない割り込みのことであるが、CPU単体では無視できないということであって、外部に
ハードウェアを用意すればマスク可能である。(マスクしてもよいなら、NMIを使う意味はないのだが)

※5
ブロックするには、NMI信号線をカットする。
つまり、基板上のパターンカットである。





第13回・メモリチェックを高速化する!

さて、前回メモリを大容量化したのであるが、1つ問題が発生した。
それは、メモリチェック(※1)に異様に時間がかかるということである。

特にMate−Rシリーズでは、信頼性を確保するためであろう、特に厳しいメモリチェック(※2)が行われている。
そのため、Server用途として大容量のメモリを搭載可能だが、その起動には異様に時間がかかるといった
事態が発生(※3)してしまう。

そのため、前回と同様の手法で、メモリチェックを高速化してしまおう!というわけである。

改造するポイント(0cdah番地)は、128KBごとにメモリを埋めたりチェックしたりしている部分である。

cld
mov di,ax
shl eax,16
mov ax,di
xor edi,edi
mov ecx,32768
rep stosd
以下、チェックポイントの埋め込み(初回のFFh時のみだが)

と、このような出だしで始まる部分である。
このルーチンのすぐ下に、埋めたデータのチェック+チェックポイントデータのチェックのルーチンがある。

今回はこの2つのルーチンをかきかえる。
埋めているほうは、ルーチンの先頭でリターンしてやればよいので、戻るためのコードである、
00CDA FF E4 jmp sp (※4)

に書き換える。(アドレスはF8000h(ITFモード時)からの相対値)

チェッカの方は、キャリーフラグでエラー状態を検出するので、ちょっと付け加えて、
00D10 F8 clc
00D11 FF E4 jmp sp
に先頭を書き換える。
これで、「メモリ内容塗りつぶし+チェックポイント埋め込みチェッカ」によりメモリチェックが行われないことになる。

これだけで(※5)、メモリチェック速度は遥かに向上するはずだ。
今回はこの辺で。


※1
その昔、9801RAやDAなどのRシリーズやDシリーズでは、単純にメモリを、
FF>AA>55>00で埋めていた。(それぞれ11111111,10101010,01010101,00000000である)
しかしながら、当時のCPUはそれほど高性能ではなかったし、メモリのベースクロックも高くはなかった。
(なにしろ、堂々とNO WAITなんてディスプレイに表示して宣伝していたくらいなんだから)
そして、メモリをこんなに大量に積む時代を予測していなかったからだ。
メモリの量が大事になってきた時代である、FA,FS,FXなどのFシリーズからは、若干メモリチェック
を緩くして、
FF>00の2種類のみになっていた。単純計算で2倍速である。
(当時これらの機種のメモリチェック速度にあこがれたものである)
余談であるが、98のステータスシンボルの一つである「ぴぽ」であるが、新しい機種になるとその速度が
早くなっているのが感じられる。
これは、もちろんCPUやクロックスピードが速くなっているためでもあるが、内部のウェイトが調整されて、
速度が意図的に速められていることもあった。

※2
メモリを埋めて、確認するといった行為はお馴染みなのであるが、その回数がかなり増やされているようだ。
チェックの合間に行われている、チップセットを使ったエラー検出などもかなり強化されていた。
基本的に、Mate−XとMate−Rでは、チェッカの構造に大差がないのだが、そういった部分が違うようだ。
ちなみに、メモリを一定の値(FF>AA>55>00に戻っていた)で埋めるという方式には、さらに
要所要所にチェックポイントとでも言うべきデータを埋め込んで、一様に埋めるだけでなく、チェックポイントを埋め込み
確認するといった、こった方式になっていた。

※3
もっとも、特に遅いのは電源ONして初めてメモリチェックが行われたときであり、リセット時などでは、
大幅に高速化されている。(設定が違うのか変更しているのかのどちらかであろう)
起動してしまえば、メモリチェックなど関係ないので非常に快適であり、起動時の1回のみ我慢すればよいのだが、
人間贅沢になるものである。
Mate−Rをしばらく使った後、Mate−Xをみるとあからさまにメモリチェックのスピードの違いがわかる。

※4
これは厳密に言えば戻るためのコードとはいえないのだが(ジャンプのためのコード)、マシンのメモリチェックを
行うまではメモリを使用するわけにはいかない。
そこで、通常のコール命令(戻ってくるアドレスをスタックにつみ、サブルーチンを呼び出す。サブルーチンからは、
リターン命令RETにより、スタックに詰まれている戻りアドレスを読み出し、そこに戻る)
はメモリを使用するため、
CPU内にあるレジスタオンリーでプログラムが書かれている。
ちなみに、ITFの一番最初にCPUの動作確認(さまざまな条件を設定して、条件ジャンプ命令群に突っ込む。それぞれの
条件ジャンプは、CPUが正しくない動作を行った場合無限ループになる方向になっているため、ここでチェックに引っかかる
と、うんともすんとも言わない。CPUが正しくない状態ではディスプレイにメッセージはおろか、BEEP音さえ正しく
動作させることができない可能性があるため、こういったフェイルセーフな構造
(エラー状態になった場合、そのまま動作して
被害が大きくなるよりは、動作を停止してそれ以上の被害を食い止める設計)
になっている)やレジスタの確認を行っている。

※5
このほかに、440FXを操作してエラーステータスレジスタを操作してあれこれチェックしている部分や、データをいれて
確認する部分などもあるのだが、どれもこれもキャンセルしても大きな変化はなかった。
今回確認したものは、あれこれ実験していたので、それらも値を変化させたり、キャンセルしているのだが、
おそらく速度にはそれほど関係ないものと思われる。





番外編・冷却ファンの増設

外部スピーカに、本体のLINEOUTから配線つなげようと、本体の後ろに手を伸ばしたのだが、
ふと、電源の冷却ファンのところに手を当ててみた。

「熱い」

本体から、熱気が噴出しているのだ。(※1)
主な熱の発生源は、HDDとCPUであると思われる。チップセットもかなり熱を持っているといえば
そうなのだが。

そこで、冷却ファンの増設を考えてみたが、増設するスペースでいいところがみつからない。
HDDの上面や、側面にはスペースが足りないのだ。
そして、CPUも冷却が間に合わないらしく、結構熱を持ってしまっていた。
そこで、これらを同時に冷やすことのできる、ちょうどよい位置と、大きさの冷却ファンが
見つかった(※2)のでさっそく増設することにした。

場所は、CPU真横である。このファンは上からつってあるが、実際にはこの下にあるCPUファンの
電源コネクタの上に乗っかる形になっており、きっちりと固定されているのだ。
冷却ファン

電源は、HDD電源用分岐コネクタから伸びている小型コネクタからとることにした。
このコネクタには、ちょうど予備用フロッピーディスクドライブとして購入したものに付属
していた、5Vコネクタの増設ケーブルを使用した。(※3)
冷却ファンの電源

若干ファンの音がやかましくなったような気がするが、かなりの風量があるファンなので気にしない
ことにする。
さて、これで夏をのりきれるであろうか・・・


※1
この時、室温は27度。まだまだ夏本番から言えば涼しいほうなのだが、やはり熱がたまるらしい。
2段重ねのHDDは、上段に設置されているWDのほうが熱を持っているが、下のIBMも熱を持っていた。
そのため、HDD増設具を再び加工して、側面にスリットを設けた。

※2
もともと、この冷却ファンは、ブラシレスファンの内部構造がどうなっているのかを調べるために、
2つ購入したものの1つ。
大きいほうが分解が楽ではないかと考えたからである。
ブラシレスファンは、結局内部にサイリスタとICチップが入っており、この制御基板で電流の方向
を変化させることにより、回転制御を行っていた。

※3
この5Vコネクタのオスコネクタは全然売ってないので、手に入れるのは困難である。
このように何かに使われているものを流用するのが一番手っ取り早いと思われる。

トップへ