diff --git a/06_day/bootpack.c b/06_day/bootpack.c index 8155700..58547ae 100644 --- a/06_day/bootpack.c +++ b/06_day/bootpack.c @@ -11,7 +11,8 @@ void HariMain(void) init_gdtidt(); init_pic(); - + io_sti(); /* IDT/PICの初期化が終わったのでCPUの割り込み禁止を解除 */ + init_palette(); init_screen8(binfo->vram, binfo->scrnx, binfo->scrny); mx = (binfo->scrnx - 16) / 2; /* 计算画面的中心坐标*/ @@ -21,6 +22,9 @@ void HariMain(void) sprintf(s, "(%d, %d)", mx, my); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); + io_out8(PIC0_IMR, 0xf9); /* PIC1とキーボードを許可(11111001) */ + io_out8(PIC1_IMR, 0xef); /* マウスを許可(11101111) */ + for (;;) { io_hlt(); } diff --git a/06_day/bootpack.h b/06_day/bootpack.h index ef3a2ac..26de49b 100644 --- a/06_day/bootpack.h +++ b/06_day/bootpack.h @@ -12,11 +12,15 @@ struct BOOTINFO { /* 0x0ff0-0x0fff */ /* naskfunc.nas */ void io_hlt(void); void io_cli(void); +void io_sti(void); void io_out8(int port, int data); int io_load_eflags(void); void io_store_eflags(int eflags); void load_gdtr(int limit, int addr); void load_idtr(int limit, int addr); +void asm_inthandler21(void); +void asm_inthandler27(void); +void asm_inthandler2c(void); /* graphic.c */ void init_palette(void); @@ -67,9 +71,13 @@ void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar); #define LIMIT_BOTPAK 0x0007ffff #define AR_DATA32_RW 0x4092 #define AR_CODE32_ER 0x409a +#define AR_INTGATE32 0x008e /* int.c */ void init_pic(void); +void inthandler21(int *esp); +void inthandler27(int *esp); +void inthandler2c(int *esp); #define PIC0_ICW1 0x0020 #define PIC0_OCW2 0x0020 #define PIC0_IMR 0x0021 @@ -81,4 +89,4 @@ void init_pic(void); #define PIC1_IMR 0x00a1 #define PIC1_ICW2 0x00a1 #define PIC1_ICW3 0x00a1 -#define PIC1_ICW4 0x00a1 \ No newline at end of file +#define PIC1_ICW4 0x00a1 diff --git a/06_day/dsctbl.c b/06_day/dsctbl.c index 8e6796f..6735c6d 100644 --- a/06_day/dsctbl.c +++ b/06_day/dsctbl.c @@ -9,7 +9,7 @@ void init_gdtidt(void) int i; /* GDT初始化 */ - for (i = 0; i < 8192; i++) { + for (i = 0; i <= LIMIT_GDT / 8; i++) { set_segmdesc(gdt + i, 0, 0, 0); } set_segmdesc(gdt + 1, 0xffffffff, 0x00000000, AR_DATA32_RW); @@ -17,11 +17,16 @@ void init_gdtidt(void) load_gdtr(LIMIT_GDT, ADR_GDT); /* IDT初始化 */ - for (i = 0; i < 256; i++) { + for (i = 0; i <= LIMIT_IDT / 8; i++) { set_gatedesc(idt + i, 0, 0, 0); } load_idtr(LIMIT_IDT, ADR_IDT); + /* IDT设置*/ + set_gatedesc(idt + 0x21, (int) asm_inthandler21, 2 * 8, AR_INTGATE32); + set_gatedesc(idt + 0x27, (int) asm_inthandler27, 2 * 8, AR_INTGATE32); + set_gatedesc(idt + 0x2c, (int) asm_inthandler2c, 2 * 8, AR_INTGATE32); + return; } diff --git a/06_day/int.c b/06_day/int.c index fc945e0..ad7176e 100644 --- a/06_day/int.c +++ b/06_day/int.c @@ -23,3 +23,36 @@ void init_pic(void) return; } + +void inthandler21(int *esp) +/* 来自PS/2键盘的中断 */ +{ + struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; + boxfill8(binfo->vram, binfo->scrnx, COL8_000000, 0, 0, 32 * 8 - 1, 15); + putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, "INT 21 (IRQ-1) : PS/2 keyboard"); + for (;;) { + io_hlt(); + } +} + +void inthandler2c(int *esp) +/* 来自PS/2鼠标的中断 */ +{ + struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; + boxfill8(binfo->vram, binfo->scrnx, COL8_000000, 0, 0, 32 * 8 - 1, 15); + putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, "INT 2C (IRQ-12) : PS/2 mouse"); + for (;;) { + io_hlt(); + } +} + +void inthandler27(int *esp) +/* PIC0中断的不完整策略 */ +/* 这个中断在Athlon64X2上通过芯片组提供的便利,只需执行一次 */ +/* 这个中断只是接收,不执行任何操作 */ +/* 为什么不处理? + → 因为这个中断可能是电气噪声引发的、只是处理一些重要的情况。*/ +{ + io_out8(PIC0_OCW2, 0x67); /* 通知PIC的IRQ-07(参考7-1) */ + return; +} diff --git a/06_day/naskfunc.nas b/06_day/naskfunc.nas index 32d1b1b..41bc001 100644 --- a/06_day/naskfunc.nas +++ b/06_day/naskfunc.nas @@ -11,6 +11,8 @@ GLOBAL _io_out8, _io_out16, _io_out32 GLOBAL _io_load_eflags, _io_store_eflags GLOBAL _load_gdtr, _load_idtr + GLOBAL _asm_inthandler21, _asm_inthandler27, _asm_inthandler2c + EXTERN _inthandler21, _inthandler27, _inthandler2c [SECTION .text] @@ -76,7 +78,7 @@ _io_store_eflags: ; void io_store_eflags(int eflags); PUSH EAX POPFD ; POP EFLAGS RET - + _load_gdtr: ; void load_gdtr(int limit, int addr); MOV AX,[ESP+4] ; limit MOV [ESP+6],AX @@ -87,4 +89,52 @@ _load_idtr: ; void load_idtr(int limit, int addr); MOV AX,[ESP+4] ; limit MOV [ESP+6],AX LIDT [ESP+6] - RET \ No newline at end of file + RET + +_asm_inthandler21: + PUSH ES + PUSH DS + PUSHAD + MOV EAX,ESP + PUSH EAX + MOV AX,SS + MOV DS,AX + MOV ES,AX + CALL _inthandler21 + POP EAX + POPAD + POP DS + POP ES + IRETD + +_asm_inthandler27: + PUSH ES + PUSH DS + PUSHAD + MOV EAX,ESP + PUSH EAX + MOV AX,SS + MOV DS,AX + MOV ES,AX + CALL _inthandler27 + POP EAX + POPAD + POP DS + POP ES + IRETD + +_asm_inthandler2c: + PUSH ES + PUSH DS + PUSHAD + MOV EAX,ESP + PUSH EAX + MOV AX,SS + MOV DS,AX + MOV ES,AX + CALL _inthandler2c + POP EAX + POPAD + POP DS + POP ES + IRETD