键盘
键盘是如何与操作系统交互的?
在显示器那一节,我们说过,CPU使用外设就是向外设写入一条指令,然后中断处理,中断处理就在键盘这一篇里,我们每按下一次键盘,就相当与向CPU发起一次中断
。
我们从键盘中断开始,看一下键盘中断的初始化
void con_init(void)
{
set_trap_gate(0x21, &keyboard_interrupt);
}
//在kernel/chr_drv/keyboard.s中
.global _keyboard_interrupt
_keyboard_interrupt:
inb $0x60, %al
//从端口0x60读扫描码,inb表示读入一个字节,扫描码(每一个按键对应一个码)
call key_table(,%eax,4) //调用keyboard+eax*4,根据不同的按键调用不同的函数
...
push $0
call _do_tty_interrupt
处理扫描码key_table+eax*4
key_table是一个函数数组
在kernel/chr_drv/keyboard.s中
key_table:
.long none,do_self,so_self,do_self //扫描码00-03
.long do_self,...,func,scroll,cursor 等
mode: .byte 0
do_self:
lea alt_map, %ebx
testb $0x20, mode //alt键是否同时按下 jne 1f
lea shift_map, %ebx testb $0x03, mode jne