0

私はOSを書いていて、PITを使おうとしています。ハンドラーを作成し、IRQ0 (割り込み 32) の ISR エントリを作成しました。ハンドラーはまったく呼び出されていません。ISRエントリを正しく入れていないと確信しています。助言がありますか?ここに私のASMコードがあります

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
        shr dword EAX, 0x10
        mov byte [_NATIVE_IDT_Contents + 0x106], AL
        mov byte [_NATIVE_IDT_Contents + 0x107], AH

PITを開始するための私のコードは

     public static void PIT_Init(uint frequency)
    {
        uint divisor = 1193180 / frequency;
        GruntyOS.IO.Ports.Outb(0x43, 0x36);
        byte l = (byte)(divisor & 0xFF);
        byte h = (byte)((divisor >> 8) & 0xFF);
        GruntyOS.IO.Ports.Outb(0x40, l);
        GruntyOS.IO.Ports.Outb(0x40, h);
    }

ハンドラーは

public static void HandlePIT()
    {
        GruntyOS.IO.Ports.Outb(0xA0, 0x20);
        GruntyOS.IO.Ports.Outb(0x20, 0x20);

        print("Tick: " + Tick.ToString());
        Tick++;
    }

から呼び出される

irq_common_stub:
pusha                  

mov ax, ds              
push eax                 

mov ax, 0x10 
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax

call System_Void__GruntyOS_Entry_HandlePIT__

pop ebx       
mov ds, bx
mov es, bx
mov fs, bx
mov gs, bx

popa                  
add esp, 8     
sti
iret          
4

1 に答える 1

0

多分これが役立つかもしれません。IRQ と例外を処理できる単純なカーネルです。

http://www.osdever.net/bkerndev/Docs/irqs.htm

http://www.ni.com/white-paper/2874/en

于 2012-09-02T09:22:34.197 に答える