これは初歩的な質問かもしれませんが、私は小さな OS を作成するためのチュートリアルに従っています。これまでのところ、割り込み記述子テーブル、ハンドラーを登録する方法、デフォルトのハンドラー (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);
}