2

OSを開発していて、PICタイマーを機能させようとしています。これは、保護モードで実行されている32ビットOSです。このコードはOSをハングさせます(理由はわかりませんが、それが私が見つけようとしていることです)。IRQ0マスクをクリアしています。このコードに何か問題がありますか、それともIDTまたはPICに問題がありますか?また、正常に動作するソフトウェア割り込みハンドラーがいくつかあるので、IDTでは機能しないと思います。

      public static void IRQ_clear_mask(byte IRQline)
    {
        ushort port;
        byte value;

        if (IRQline < 8)
        {
            port = 0x21;
        }
        else
        {
            port = 0xA1;
            IRQline -= 8;
        }
        value = (byte)(GruntyOS.IO.Ports.Inb(port) & ~(1 << IRQline));
        GruntyOS.IO.Ports.Outb(port, value);
    }



mov byte [_NATIVE_IDT_Contents + 254], AL
        mov byte [_NATIVE_IDT_Contents + 255], AH
        mov dword EAX, irq_common_stub
        mov byte [_NATIVE_IDT_Contents + 0x100], AL
        mov byte [_NATIVE_IDT_Contents + 0x101], AH
        mov byte [_NATIVE_IDT_Contents + 0x102], 0x8
        mov byte [_NATIVE_IDT_Contents + 0x105], 0x8E
4

1 に答える 1

1

割り込みサブルーチンは常に可能な限り短くする必要があります。x86アーキテクチャと一緒に使用されるPICは、そのマスクを使用して同じ優先度の割り込みを同時に処理しますが、ISR内で割り込みが発生すると問題が発生します。それを行うためのより良い方法は、フラグを立てる(ISRからアクセス可能な変数をTrueにするなど)ことであり、OSに割り当てられたクォンタム間で、表示したとおりにマスクをフラッシュできます。または、スケジューリング戦略が適切であると判断した場合は、クォンタムを使用して実行します。OSがプリエンプティブでない場合は、ISRを終了し、フラッシュを実行してから、ユーザープログラムに戻ることをお勧めします。

しかし、あなたの問題はこれではないようです。自分のケースで何が起こっているのかを理解できるように、優れたデバッガーまたはエミュレーターを入手する必要があります。

初期化されていない割り込みが発生した場合、この動作が発生する可能性があります。可能であれば、デバッガーを使用して、OSの実行がクラッシュしたときの場所を確認する必要があります。CPUをストールさせる一般的なIRQ関数に入りましたか?これは、複数の組み込みチップのデフォルトの動作です。

于 2012-09-02T18:40:05.970 に答える