2

私のシステムプログラミングクラスでは、小さくてシンプルな趣味のOSに取り組んでいます。個人的には、ATAハードディスクドライバに取り組んでいます。私は、1行のコードが障害を引き起こし、すぐにシステムを再起動するように見えることを発見しました。問題のコードは、IDE割り込みの割り込みサービスルーチンの最後にあります。IDEチャネルを使用していたので、それらはスレーブPIC(マスターを介してカスケードされます)を介して送信されます。元々、私のコードは割り込み終了バイトをスレーブに送信するだけでしたが、教授はそれをマスターPICにも送信する必要があると言いました。

だからここに私の問題があります。EOIバイトをマスターPICに送信する行のコメントを外すと、システムは3回障害を起こし、その後再起動します。同様に、コメントを残しておくと、システムは実行されたままになります。

_outb( PIC_MASTER_CMD_PORT, PIC_EOI );  // this causes (or at least sets off) a triple fault reboot
_outb( PIC_SLAVE_CMD_PORT, PIC_EOI );

システムの残りの部分を見ずに、誰かがここで何が起こっている可能性があるかを説明することは可能ですか?

注:暗闇の中でのショットと同じように、_outb()呼び出しを別の_outb()呼び出しに置き換えました。これにより、IDEコントローラーで割り込みが有効になっていることを確認しましたが、生成されたアセンブリはほぼ同じでした。これは障害を引き起こしませんでした。

* _outb()は、x86OUTB命令のラッパーです。

問題となっているマスターPICにEOIを送信する機能の何が特別なのですか?

コードを見ないと答えられないかもしれませんが、見てくれてありがとう!

4

2 に答える 2

3

トリプルフォールトは通常、スタックオーバーフローまたは奇数スタックポインタを指します。フォールトまたは割り込みが発生すると、システムはすぐにスタックにジャンクをプッシュしようとします(フォールトハンドラーを呼び出す前)。スタックがホースで接続されている場合、これにより別の障害が発生し、スタックにさらに多くのものをプッシュしようとします。これにより、別の障害が発生します。この時点で、システムはあなたをあきらめて再起動します。

私は実際に(約20年前にDellで働いていたときに)外部ハードウェアなしでCPUをリセットする方法について愚かな特許を持っているのでこれを知っています(以前はキーボードコントローラーを介して行われていました):

   MOV ESP,1
   PUSH EAX    ; triple fault and reset!

OUTB命令は、それ自体で障害を引き起こすことはできません。私の推測では、割り込みを再度有効にすると、スタックに問題があるときに割り込みがトリガーされます。

于 2009-06-01T17:34:23.847 に答える
1

PICを再度有効にするときは、CPUの割り込みフラグを設定して実行していますか、それともクリアしていますか(つまり、CLIオペコードの後で実行していますか、それともオペコードの後で実行していますSTIか)。

CPUの割り込みフラグが有効になっていると仮定すると、PICを再度有効にすることで、保留中の割り込みがCPUに到達できるようになります。これにより、コードが中断されたり、IDTで指定されたベクトルにディスパッチされたりします。

したがって、障害を直接引き起こしているのはオペコードではないと思います。むしろ、障害が発生しているのは、PICを再度有効にした結果として発生する割り込みの結果として実行されるコードです。

于 2009-05-20T04:11:26.110 に答える