[osask 6836] Re: 98版のバグについて

  こんにちは、川合です。


BOARD:  さんは 2004/01/05 18:33:42 の「[osask 6835] BOARD:98 版
のバグについて」で書きました:

>FD直接ブート型の98版OSASK(Ver4.3)を、手元の実機(PC-9801NX/C 14.6M-RAM)で
>起動したところ、動作しませんでした。OS実行イメージの逆アセンブル結果と、
>公開されているソースコードを調べたところ、大きく見て2つの問題点がありま
>した。

  同じ主旨の書き込みを2chのOSASKスレッドで拝見しました。たぶん、
同じかただろうと思います。ご報告をありがとうございました。

  どちらの問題も重要だと考えておりますので、次バージョンで対策を
講じたいと思っています。しかし対策方法は、提案されたものとは違う
方法にする予定です。

・メモリ容量把握について

  BIOSワークエリア参照による方法はできれば避けたいと考えています
。あらゆる手段を考えて、それでも駄目なときにかぎって、BIOSワーク
を参照する方法に変更したいです。

  で、今考えている案は、16MB以内については今まで通り検索して、
16MB以上の部分は、次のテストをクリアした場合にのみ、テストをさせ
ようと思っています。

    EAX = 0xaa55aa55;
    ECX = EAX;
    EDX = [0x00000000];
    NOT(ECX);
    [0x00000000] = EAX;
    [0x01000000] = ECX;
    ECX = [0x00000000];
    [0x00000000] = EDX;
    if (EAX == ECX) {
        /* A24-31はデコードされている */
    } else {
        /* A24-31はデコードされてない */
    }

  今のところTOWNS版は、386SXかどうかを判定してそれで16MB以上をチ
ェックするかどうかを判断していますが、次バージョンでは、TOWNSも
AT版も、みんなこの方法で統一したいと思っています。

  2chの書き込みでは、「メモリチェックは起動時に行われているのだ
から、それを利用するべきであって、こんなにたらたらとチェックする
なんて時間の無駄だ」というのがありました。それは確かに一つの考え
方です。

  僕は「BIOSは拡張メモリの全てをテストするべきではない」という考
えの持ち主です。そんなことはOSにやらせるべきです。OSなら他のデバ
イスの初期化中などにバックグラウンドでいくらでもメモリテストがで
きます。BIOSはそんなチェックなんてしなくていいので、さっさと起動
してほしいです。厳密なテストが必要なら、それこそmemtest等をやれ
ばいいわけです(まさか再起動のたびにメモリのコンディションが変化
するとは思えないわけで)。

  そんなわけで、BIOSが将来メモリテストをやらなくなってもいいよう
に、OSが自分でやるわけです。TOWNSと98に「将来」はまずないのです
が、これは僕のポリシーみたいなものです。

  余談ですが、将来もし僕がBIOSを改造するようになったら(OSASKや
KHBIOSを埋め込みたい)、BIOSメニューにメモリテスト省略(BIOSメニ
ューでテストして、その結果をCMOSに書いておき、起動時にそれをメモ
リテスト結果として利用)みたいなのを作ると思います。

・起動時のキーボード割り込みの取りこぼし問題

  これはいろいろ考え中です。結局Junkie98さんの指摘している方法に
する可能性もかなりあります。BIOSを使わずに済みますしね。

  とりあえずごまかしの方法として考えているのは、PIC初期化直後に
限って、IRQ-01に頼ることなく、8251AのRxRDYをチェックして、1バイ
トを読み取ろうというものです。

> さらに、8251に関しては、全般にリカバリ時間が不足気味のように思われる。
>このチップでは、入力されるバスクロック周期の数倍〜十数倍のリカバリ時間が
>必要とされる。また、本体側でキーコード受信が完了したことを、キーボードが
>確実に検出するための時間も、かなり必要である。この点で、OUT命令の直後と、
>IN命令の直前には、それぞれ40μs前後のウェイトを入れるのがよい。OUT 5FH,AL
>は、機種別のばらつきを入れた最小値が0.7μsほどなので、回数にすれば57回の
>ループとなる。

  98版のドライバでは、8251Aへのアクセスが集中するのは、IRQ-01ド
ライバの、

    IN(AL, 0x0043);
    NOP();
    IN(AL, 0x0041);

の部分くらいです。最初のステータスリードは、ダミーです。やらなく
ていいのならやりません。IRQを受けたら(必要がなくても)ステータ
スを読んでやる、というのが僕のプログラミングの習慣になっているの
です。8251Aはそんなことをしなくても問題なく動くなら、やめます。

  そして次のINでキーボードデータを受け取っています。

  40マイクロ秒のリカバリですが、これをご指摘の方法でドライバに記
述することは、OSASKではまずありえません。40マイクロ秒もあれば、
100MHzのマシンでも4千クロックになるわけで、こんなに長い時間を何
もしないでいるわけにはいかないのです(これだけあれば、他のタスク
に切り替えて、ちょっと仕事して帰ってくることだってできます)。

  そこで僕のドライバは、RxRDYを見て受信する方法を取っていません
。IRQに頼ります。8251Aは受信可能な状態になってからIRQを発生させ
るまでにちょっと間があるようで、IRQが来た時だけデータポートをリ
ードしています。この方法ならリカバリ時間はたぶん不要です(これ
でうまくいかない例がでたら、その時はどのくらいのwaitが必要なのか
をいろいろ試したいと思います)。

  ということで、この部分に関しては、(明示的なリカバリタイム確保
がないのに)Pentiumクラスの98であっても問題なく動いています。

  もちろん、今検討しているPIC初期化直後のRxRDYによるリードに関し
ては、37マイクロ秒のwaitが必要でしょう。・・・ちなみに僕の記憶に
間違いがなければ、この37マイクロ秒という数字は8251Aの問題ではな
く、キーボード側の問題です。RDYの変化を見てキーデータを送ってい
るらしいです。RDYが37マイクロ秒以上続かないと、キーボード側は自
分の送信が完了していないと思い込むらしく、ハングアップします。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/

ML番号でジャンプ
ML単語検索