出典: http://software.intel.com/en-us/articles/introduction-to-pc-architecture/
例外番号 10h は「浮動小数点エラー」に対応しますが、ソフトウェア割り込み 10h は「ビデオ サポート」BIOS 割り込みにも対応します (両方ともリアル モード)。
私は何が欠けていますか?
出典: http://software.intel.com/en-us/articles/introduction-to-pc-architecture/
例外番号 10h は「浮動小数点エラー」に対応しますが、ソフトウェア割り込み 10h は「ビデオ サポート」BIOS 割り込みにも対応します (両方ともリアル モード)。
私は何が欠けていますか?
あなたは何も見逃していません。
8088 プロセッサ (元の IBM PC で使用されていたプロセッサ) は、例外 0、1、2、3、および 4 のみを定義していました。
そのため、IBM はハードウェア割り込みハンドラーに 0x8 から 0xF を使用し、BIOS ルーチンに 0x10 以上を使用しました。何らかの理由で、IBM は、Intel が将来のプロセッサー例外のために番号 0x5 から 0x1F を非常に明確に予約していたという事実を無視しました。
時間が経つにつれて、より多くの例外が必要になり、インテルは先に進んでそれらを割り当てました. ほとんどの場合、レガシー ソフトウェアはこれらの例外をトリガーしませんでしたが、新しいオペレーティング システム (プロテクト モードで実行されたもの) は、プロセッサの例外と衝突しないように異なる番号を割り当てることができました。
あまり互換性を損なうことなく、新しいプロセッサ機能を使用できるようにするために、古いソフトウェアに多くのハックが追加されました。確かではありませんが、おそらく新しい BIOS では、INT10 がソフトウェア割り込みによってトリガーされたのか、それとも INT10 ハンドラーのコプロセッサーによってトリガーされたのかを検出しようとしたのではないかと思います。
参考までに、386 プログラマーズ マニュアルから:
コプロセッサー・エラーは割り込み 16 にベクトルします。コプロセッサーを備えたすべての 80386 システムは、コプロセッサー・エラー例外に割り込みベクトル 16 を使用する必要があります。8086/8088 システムが 8087 割り込みに別のベクターを使用する場合、両方のベクターがコプロセッサー エラー例外ハンドラーを指す必要があります。
わかりました、こちらの Watcom のサイトをご覧ください。8087 についての古いメモも興味深いですが、これは私が考える重要な部分です。
大多数の PC ユーザーがまだ PC DOS を実行しており、IBM PC との互換性を必要としているという市場の現実により、IBM AT が数学エラーを処理する方法は簡単ではありませんでした。IBM が PC の設計時に Intel の推奨事項を無視したため、286 の Math Fault または割り込み 16 が BIOS ビデオ サービス割り込み 10h (10 進数の 16) と競合しました。その上、既存のソフトウェアは、数学例外が INT 2 を介して到着することを想定していました。
CPU と FPU の ERROR ピンを接続する代わりに、IBM AT はマザーボード回路を使用して 287 ERROR 信号をカスケード接続された 2 番目の 8259A PIC にルーティングし、IRQ 13 を使用して演算エラーを CPU に通知しました。デフォルトの BIOS IRQ 13 ハンドラー (つまり、INT 75h ベクトル - 2 番目の PIC の最初の IRQ 行である IRQ 8 は、割り込みベクトル 70h に対応することに注意してください) には、既存のソフトウェアとの互換性のために INT 2 を呼び出すコードが含まれています。したがって、AT 上のソフトウェアは引き続き NMI ベクトルをフックし、PC または AT 上で変更せずに実行できます。
IBM AT の外部回路は、287 がその ERROR 信号をアサートすると、286 の BUSY 入力ピンをアクティブにします。これにより、以降の FPU 命令の実行が防止され、287 がエラーを通知した後、286 が結果の割り込みの処理を開始する前の時間枠での問題を回避するために必要です。
浮動小数点フォルトは、エラー状態によって生成される CPU 割り込みです。これは IRQ とは異なります。
PIC (プログラマブル割り込みコントローラー) を使用して、どの IRQ がどの CPU 割り込みにマップされるかを変更できます。(命令を使用して) PIC の IO ポートに適切なシーケンスを送信するOUT
と、浮動小数点例外からの CPU 割り込みと競合しないように IRQ をマップできます。
この文書も参照してください。
編集:しかし、あなたの質問をもう一度読んだので...ここではIRQについて話しているのではありません。BIOS Int 10h はまったく別の獣です...これは、BIOS がビデオ ルーチン用に実装したコードです。OS を作成していて、浮動小数点障害を処理する必要があるかどうか疑問に思っている場合は、おそらく、この特定の BIOS 割り込みが存在することを忘れる必要があります。:-)
編集 2: 考えてみると、おそらく古い DOS プログラムがこれを回避する方法は、IVT エントリをバックアップし、独自の例外ハンドラをその場所に配置し、いくつかの浮動小数点演算を実行し、完了時に古い IVT エントリを復元することでした。 FPUで。
簡単な答えは、int 10h
浮動小数点エラーはプロテクト モードの例外であり、int 10h
BIOS ビデオ サービスはリアル モードの割り込みであるということです。
NE
幸いなことに、レジスタのビットをクリアするCR0
と、例外の発生が防止され、PM32 で単純な割り込みとして使用できるようになります (たとえば、32 ビット プロテクト モード BIOS エクステンダ)。