3

这可能是一个愚蠢的问题,但我一直在关注编写小型操作系统的教程。到目前为止,我已经设置了中断描述符表、注册处理程序的方法、默认处理程序(将 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);
}
4

1 回答 1

0

谢谢回复的人。您的回答很有帮助,但问题是在设置 IDT 并重新映射 PIC 之后,我忘记包含程序集以再次启用中断。

PS:是的,在重新映射 PIC 后,我用 0x0 屏蔽了它们,这应该启用所有中断。-谢谢迈克尔·佩奇。

此外,我在 Ubuntu 12.10 上的 Oracle VirtualBox 中运行内核,偶尔在真实硬件上进行测试。它也不起作用,所以我认为计时器没有被禁用。-谢谢马丁詹姆斯

于 2014-10-24T08:12:45.727 回答