键盘中断如何最终作为过程信号

键盘中断如何最终作为过程信号

我正在研究 Linux 内核,知道 O'Reilly's了解 Linux 内核最近涵盖了信号和中断处理章节,坚持一些基本的 2.4 Linux 版本,并深入研究我能理解的代码。

然而,我无法向自己解释,也无法在其他地方找到答案,当按下 actrl + c来控制在 shell 中运行的进程时,会发生什么指令流。

到目前为止我所做的事情:

  1. 一旦按下键盘,APIC 就会将 IRQ 线提升到 cpu
  2. 如果中断不可屏蔽,CPU 会加载相应的 int。来自 IDT 的处理程序
  3. 比,一些关键的整数。调用处理程序代码,进一步处理char从APIC中键盘设备的寄存器到其他寄存器的按下

从这里开始,这对我来说很模糊。

但我确实理解,中断处理不在进程上下文中,而异常在进程上下文中,因此很容易弄清楚异常如何更新current->thread.error_codecurrent->thread.trap_no最终调用force_sig.然而,一旦执行中断处理程序(如上面的示例所示),它最终如何进入所需进程的上下文并生成信号?

答案1

正如您所想的那样,按键会产生中断。中断由中断处理程序处理;哪个处理程序取决于硬件类型,例如 USB 键盘或 PS/2 键盘。中断处理程序从硬件读取关键代码并将其缓冲。 tty 驱动程序从缓冲区中拾取该字符,在使用 Ctrl-C 的情况下,该驱动程序将其识别为中断字符并发送一个SIGINT到终端的前台进程组。看n_tty.c

请注意,tty 驱动程序仅涉及“终端”类型(命令行)接口,如 Linux 控制台、串行终端 ( /dev/ttyS*) 和伪 tty。 GUI 系统(X11、Wayland 实现)以不同方式处理输入设备。

相关内容