OS自作入門 七日目

「OS自作入門 七日目」の編集履歴(バックアップ)一覧に戻る

OS自作入門 七日目 - (2007/07/25 (水) 15:47:23) の編集履歴(バックアップ)


OS自作入門7日目のまとめ

自分のためのまとめなので、他の人には意味不かも。

FIFOとマウス制御

FIFOについては6日目で説明した。

キーコードの取得

//int.c
#define PORT_KEYDAT             0x0060

void inthandler21(int *esp)
{
       struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;
       unsigned char data, s[4];
       io_out8(PIC0_OCW2, 0x61);       /* IRQ-01受付完了をPICに通知 */
       data = io_in8(PORT_KEYDAT);

       sprintf(s, "%02X", data);
       boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31);
       putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s);

       return;
}
まずは以下の部分。
        io_out8(PIC0_OCW2, 0x61);       /* IRQ-01受付完了をPICに通知 *
これを行うことで、PICに対して割り込みを受け取ったということを通知することができる。これを行わないと、PICは割り込みをCPUに対して行った後、機器からの割り込みを受け付けない。そのためこれは非常に重要である。らしい。このとき出力するデータは0x61となっているが、これは以下の式で求められる。
 0x60+(IRQ number)
キーボードはIRQ1であるので、この式に当てはめると0x61となる。

次に装置番号0x60からデータを8ビット入力する。これがキーコード。

割り込み処理は手早く

上の割り込み処理は、割り込みハンドラ中に文字の表示を行っている。
割り込みはいつ起きるかわからないので、割り込みハンドラ内の処理は最小限にするべきである。
そこで割り込みハンドラ中ではデータの受け取りのみを行い、他の場所で文字表示を行うようにする。

キーボードからのデータを受けとるためにバッファを用意する。data,flagという変数をもつ構造体である。
キーボード用割り込みハンドラではキーボードからのデータをそのバッファに保存するだけにする。
//bootpack.h
struct KEYBUF {
       unsigned char data, flag;
};

//int.c
struct KEYBUF keybuf;

void inthandler21(int *esp)
{
       unsigned char data;
       io_out8(PIC0_OCW2, 0x61);       /* IRQ-01受付完了をPICに通知 */
       data = io_in8(PORT_KEYDAT);
       if (keybuf.flag == 0) {
               keybuf.data = data;
               keybuf.flag = 1;
       }
       return;
} 





ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。