我正在尝试使用OSDev等编写操作系统。现在,我一直在制作键盘中断处理程序。当我编译操作系统并运行内核时,qemu-system-i386 -kernel kernel/myos.kernel一切运行正常。当我将所有内容放入ISO映像并尝试使用进行运行时qemu-system-i386 -cdrom myos.iso,当我按一个键时它将重新启动。我认为这是由我的中断处理程序中的某些问题或错误的IDT条目引起的。
我的键盘处理程序(AT&T语法):
.globl keyboard_handler
.align 4
keyboard_handler:
pushal
cld
call keyboard_handler_main
popal
iret
Run Code Online (Sandbox Code Playgroud)
我在C中的主要处理程序:
void keyboard_handler_main(void) {
unsigned char status;
char keycode;
/* write EOI */
write_port(0x20, 0x20);
status = read_port(KEYBOARD_STATUS_PORT);
/* Lowest bit of status will be set if buffer is not empty */
if (status & 0x01) {
keycode = read_port(KEYBOARD_DATA_PORT);
if(keycode < 0)
return;
if(keycode == ENTER_KEY_CODE) {
printf("\n");
return;
}
printf("%c", keyboard_map[(unsigned char) keycode]);
}
} …Run Code Online (Sandbox Code Playgroud)