4

インテルのソフトウェア開発者マニュアルでは、割り込みベクトル 32 ~ 255 は通常、外部 IO デバイス用にユーザー定義されていると書かれています。私のシステム プログラミング クラスでは、単純なデバイス ドライバーを開発する必要があります。私の質問は、特定のデバイスに使用する特定の割り込みベクトルを定義するにはどうすればよいですか? これはBIOSで行われますか?

注: 私たちは単純なオペレーティング システムを開発しているので、私の状況は非常に特殊ですが、最終的には x86 システムでこれがどのように行われるかを理解する必要があります。現在、私たちのシステムは、32 を超えるいくつかの割り込みベクトルがシリアル ポートやキーボードなどのデバイスに割り当てられるように設定されています。Intel 82801EB ICH5 IO コントローラのデータシート、特に 8259 PIC に関するセクションを読むと、IRQ15 がセカンダリ IDE チャネルであると書かれています。それは最終的にどのようにして割り込みベクトルとしてスタックに置かれるのでしょうか?

この質問が意味をなさないほど混乱しているかもしれませんので、事前にお詫び申し上げます。

編集: したがって、システム プログラミング クラスには非常に単純な OS があり、ベクトル番号が指定された特定の割り込みを処理するために ISR をインストールするためのカーネル ルーチンがあります。前四半期のクラスで、教授は、キーボードをベクトル番号 0x2c などとして定義するヘッダー ファイルを提供してくれました。カーネル ルーチンを使用して、プライマリまたはセカンダリ IDE チャネル割り込みをさまざまな ISR にマップする方法を見つけようとしています。今のところ、未使用のすべての割り込みベクトルには、割り込みが発生した場合にメッセージを出力するデフォルトのハンドラーがあるため、現時点では IDE 割り込みはオンになっていませんが、それは別の問題です。

4

6 に答える 6

0

INT 21h / AH=25h - 割り込みベクタを設定; 入力: AL = 割り込み番号。DS:DX -> 新しい割り込みハンドラ。

于 2010-01-24T23:06:42.027 に答える
0

サポート コード、特に PIC 初期化ルーチンで答えを見つけたようです。次のコードでは、IRQ ラインは、IDT のオフセット 20h と 28h で、マスター PIC とスレーブ PIC のそれぞれにマップされます。

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */

__outb( PIC_MASTER_IMR_PORT, 0x20 );
__outb( PIC_SLAVE_IMR_PORT, 0x28 );

これは、キーボードがベクトル番号 2c にマップされ、プライマリ チャネルとセカンダリ チャネルがそれぞれ 2e と 2f にマップされることを意味します。もっと上手に質問すれば、もっといい答えが返ってきた人もいるかもしれませんが、とにかく助けてくれてありがとう!

82801EB ICH5 データシートの表 45 に 8259 の IRQ ラインの詳細が記載されています。私の OS では、マスターは単純にオフセット 20h でロードされ、スレーブは 28h です。

ありがとう!

于 2009-04-21T19:34:25.097 に答える
0

私が思い出したように、メモリ空間の先頭に、特定の割り込みが発生したときに呼び出すルーチンを指すベクトル テーブルがあります。ここではレベルが低すぎる可能性があります (古い x86 アセンブリ プログラマー) が、ベース レベルでは、そのテーブルにベクターがインストールされ、ルーチンが呼び出されます。私は古い参考資料を持っていないので、実際の呼び出しを提供することはできませんが、公式の方法が BIOS の外部で動作しているとしたら、私は驚かれることでしょう。

最近の GUI では、割り込みの共有やその他の優れた機能を可能にする、より適切な方法が他にもあると確信しています。

編集: その多くは無視してください。ハードウェア割り込みの外側にある割り込み 16 以上を見ていることがわかりました。そのスペースに興味深いハードウェアが存在する前に、そのレベルのプログラミングから離れたので、最初の 15 の IRQ (16 番目はコントローラー間のカスケード) だけを処理しました。他の誰かが興味を持っている場合に備えて、私はそれを残しています:)

于 2009-04-21T15:39:23.897 に答える