键盘中断如何最终成为进程信号

Ash*_*sev 5 kernel signals interrupt linux-kernel

我正在通过 O'Reilly 的“理解 Linux 内核”学习 linux 内核,最近涵盖了信号和中断处理章节,坚持一些基本的 2.4 linux 版本,并就我所能理解的代码深入研究。

然而,我无法向自己解释,也无法在别处找到答案,比如说,当 actrl + c被按下以运行在 shell 中的进程时,发生的指令流是什么。

到目前为止我所做的:

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

从这里对我来说很模糊。

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

Joh*_*éen 9

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

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