在minix3的终端驱动程序keyboard.c中,为什么存在ibuf?;

在minix3的终端驱动程序keyboard.c中,为什么存在ibuf?;,keyboard,buffer,driver,minix,Keyboard,Buffer,Driver,Minix,《操作系统设计与组织化》第3版,第351页。 键盘中断服务程序是kbd_中断(第15335行),每当按下或释放一个键时调用。它调用scode从键盘控制器芯片获取扫描代码。。。所有原始扫描代码都放在循环缓冲区中,当前控制台的tp->tty_事件标志被提升(第15350行)。。。然后kbd_中断会立即返回。。。第13795行的continue语句导致主循环的新迭代立即在第13764行开始。当执行转移到循环顶部时,控制台设备的tp->tty\u事件标志现在被设置,设备特定的例程kb\u read(第1

《操作系统设计与组织化》第3版,第351页。 键盘中断服务程序是kbd_中断(第15335行),每当按下或释放一个键时调用。它调用scode从键盘控制器芯片获取扫描代码。。。所有原始扫描代码都放在循环缓冲区中,当前控制台的tp->tty_事件标志被提升(第15350行)。。。然后kbd_中断会立即返回。。。第13795行的continue语句导致主循环的新迭代立即在第13764行开始。当执行转移到循环顶部时,控制台设备的tp->tty\u事件标志现在被设置,设备特定的例程kb\u read(第15360行)被使用控制台tty结构的tp->tty\u devread字段中的指针调用。 Kb_read从键盘的循环缓冲区获取扫描代码,并将ASCII代码放入其本地缓冲区


我认为ibuf不能有超过一个扫描代码。所以我认为一个char变量就足够了。为什么循环ibuf存在

我要问你的问题是:为什么你认为一次只能在缓冲区中有一个扫描代码

中断与线程化代码非常相似,因为您不知道代码位的执行顺序。每当按下一个键时,就会触发这个特定的中断,这与当时其他代码可能在做什么或不在做什么无关(当然,假设中断没有被禁用)

在从缓冲区中提取扫描代码之前,很可能会连续两次快速中断


允许一个32字节的缓冲区,该缓冲区被认为足够大,可以处理按键速度比提取速度快的可能性。如果缓冲区填满,随后的按键将丢失(键盘硬件被选通以提取按键代码,但不会添加到缓冲区)。

在minix 3中,内核将中断更改为硬消息,终端驱动程序将中断作为消息处理。