"操作系统设计和组织"第3期,第351页。键盘中断服务例程是kbd_interrupt(第15335行),在按键被按下或释放时调用。它调用scode从键盘控制器芯片. ...获取扫描码所有原始扫描码都放置在循环缓冲区中,当前控制台的tp->tty _events标志被触发(第15350行). ...kbd_interrupt在此. ...之后立即返回第13795行中的continue语句导致主循环的新迭代立即在第13764行开始。当执行转移到循环的顶部时,发现控制台设备的tp->tty _events标志现在被设置,并且使用控制台tty结构的tp->tty _devread字段中的指针调用特定于设备的例程kb _read(第15360行)。Kb_read从键盘的循环缓冲区中获取扫描码,并将ASCII码放入其本地缓冲区。
我认为ibuf不能有多个扫描码。所以我认为一个char变量就足够了。为什么循环会存在?
我的问题是:为什么你认为你一次只能在缓冲区中有一个扫描码?
中断与线程代码非常相似,因为你不知道代码执行的顺序。当一个键被按下时,这个特殊的中断将被触发,与其他代码可能或不可能在做什么无关(当然假设中断没有被禁用)。
在从缓冲区中提取扫描码之前,很可能会出现连续两次中断。
Minix3源代码允许一个32字节的缓冲区,这个缓冲区被认为足够大,可以处理键被按下的速度比键被提取的速度快的可能性。如果缓冲区被填满,则随后的按键将丢失(键盘硬件将被筛选以提取键码,但不会将其添加到缓冲区中)。