0

我正在编写一个操作系统并尝试使用 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 回答