我对OS开发还很陌生,最近我开始了一个业余爱好项目,它创建了一个尽可能简单的纯文本操作系统。它是用C语言编写的,并得到了汇编的帮助,并使用GRUB进行引导,我已经在VirtualBox中对其进行了测试,有时还将其放在闪存驱动器上,以便在古老的(〜2009)笔记本电脑上进行测试。到目前为止,我已经实现了一些基本的文本输出功能,考虑到最近没有崩溃,我认为我的GDT和IDT实现是可以的。目前,我正在尝试使中断驱动的键盘驱动程序正常工作。
我认为我已经正确设置了PIC,并且似乎很幸运能向PS / 2控制器和键盘发出命令并通过中断处理程序捕获响应。例如,这是在为键盘提供识别命令时的调试输出:
Initializing kernel...
Setting PS/2 controller status: 0x05
Sending keyboard command: 0xF2
Keyboard interrupt: 0xFA
Keyboard interrupt: 0xAB
Keyboard interrupt: 0x83
Run Code Online (Sandbox Code Playgroud)
返回的数据似乎是正确的,这证明我的中断处理程序可以连续多次工作而不会崩溃或发生任何事情,因此我不必担心我的IDT或ISR实现。现在,这是我将0xF4命令发送到键盘以开始扫描按键时的输出:
Initializing kernel...
Setting PS/2 controller status: 0x05
Sending keyboard command: 0xF4
Keyboard interrupt: 0xFA
Run Code Online (Sandbox Code Playgroud)
状态代码为“确认”(0xFA)的中断看起来很有希望,但是之后按键时什么也没有发生。对于这两个示例,在VirtualBox和我一直使用的笔记本电脑上运行时,我得到的结果都是相同的。
以下是键盘驱动程序中的一些相关代码:
#define KEYBD_DATA 0x60
#define KEYBD_CMD 0x64
// wrapper for interrupt service routine written in assembly
extern void keyboard_interrupt();
// called from assembly ISR
void keyboard_handler() {
u8 data = read_port(KEYBD_DATA);
print("Keyboard interrupt: 0x");
printx(data);
putc('\n');
pic_eoi();
}
// functions …Run Code Online (Sandbox Code Playgroud)