0

《操作系统设计与组织》第 3 版,第 351 页。键盘中断服务程序是 kbd_interrupt(第 15335 行),每当按下或释放键时都会调用。它调用 scode 从键盘控制器芯片获取扫描码。...所有原始扫描代码都放置在循环缓冲区中,并引发当前控制台的 tp​​->tty _events 标志(第 15350 行)。...并且 kbd_interrupt 在此之后立即返回。... 第 13795 行的 continue 语句导致主循环的新迭代立即在第 13764 行开始。当执行转移到循环顶部时,现在发现控制台设备的 tp->tty _events 标志为set 和 kb _read(第 15360 行),特定于设备的例程,使用控制台 tty 结构的 tp->tty _devread 字段中的指针调用。

我认为 ibuf 不能有多个扫描码。所以我认为一个 char 变量就足够了。为什么会存在圆形 ibuf?

4

1 回答 1

1

我对您的问题必须是:为什么您认为一次只能在缓冲区中有一个扫描码?

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

在从缓冲区中提取扫描代码之前,您很可能会快速连续地获得两个中断。

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

于 2013-04-23T07:22:30.597 回答