这可能是一个愚蠢的问题,但我一直在关注编写小型操作系统的教程。到目前为止,我已经设置了中断描述符表、注册处理程序的方法、默认处理程序(将 int 编号打印到屏幕)并将 PIC 重新映射到中断 0x20 及以上。
我只是将可编程间隔计时器设置为 50Hz,但它不会生成任何 IRQ0。我已经在描述符表中的中断 32 处设置了计时器处理程序,但是如果我手动生成中断:__asm__ volatile ("int $0x20);
我会在屏幕上打印“Tick:0x00000001”。
这是我的 timer.c 文件:
#include <common.h>
#include <drivers/timer.h>
#include <drivers/isr.h>
#include <drivers/display.h>
#include <drivers/io.h>
u32int tick = 0;
static void timer_callback(registers_t regs) {
tick++;
print("Tick: ");
print_hex_dword(tick);
print("\n");
}
void init_timer(u32int frequency) {
register_interrupt_handler(IRQ0, &timer_callback);
u32int divisor = 1193180 / frequency;
outb(0x43, 0x36);
u8int l = (u8int) (divisor & 0xFF);
u8int h = (u8int) ((divisor >> 8) & 0xFF);
outb(0x40, l);
outb(0x40, h);
}