3

これは初歩的な質問かもしれませんが、私は小さな 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);
}
4

1 に答える 1

0

回答してくださった方々、ありがとうございます。あなたの答えは役に立ちましたが、問題は、IDT をセットアップして PIC を再マッピングした後、割り込みを再度有効にするためにアセンブリを含めるのを忘れていたことです。

PS: はい、PIC を再マッピングした後、すべての割り込みを有効にする 0x0 でそれらをマスクしました。-ありがとう、マイケル・ペッチ。

また、Ubuntu 12.10 の Oracle VirtualBox でカーネルを実行しており、実際のハードウェアで時折テストを行っています。どちらでも機能しなかったので、タイマーが無効になっているとは思いません。-ありがとうマーティン・ジェームス

于 2014-10-24T08:12:45.727 に答える