私のシステムプログラミングクラスでは、小さくてシンプルな趣味の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を送信する機能の何が特別なのですか?
コードを見ないと答えられないかもしれませんが、見てくれてありがとう!