我正在研究 Linux 内核,知道 O'Reilly's了解 Linux 内核最近涵盖了信号和中断处理章节,坚持一些基本的 2.4 Linux 版本,并深入研究我能理解的代码。
然而,我无法向自己解释,也无法在其他地方找到答案,当按下 actrl + c
来控制在 shell 中运行的进程时,会发生什么指令流。
到目前为止我所做的事情:
- 一旦按下键盘,APIC 就会将 IRQ 线提升到 cpu
- 如果中断不可屏蔽,CPU 会加载相应的 int。来自 IDT 的处理程序
- 比,一些关键的整数。调用处理程序代码,进一步处理
char
从APIC中键盘设备的寄存器到其他寄存器的按下
从这里开始,这对我来说很模糊。
但我确实理解,中断处理不在进程上下文中,而异常在进程上下文中,因此很容易弄清楚异常如何更新current->thread.error_code
并current->thread.trap_no
最终调用force_sig
.然而,一旦执行中断处理程序(如上面的示例所示),它最终如何进入所需进程的上下文并生成信号?
答案1
正如您所想的那样,按键会产生中断。中断由中断处理程序处理;哪个处理程序取决于硬件类型,例如 USB 键盘或 PS/2 键盘。中断处理程序从硬件读取关键代码并将其缓冲。 tty 驱动程序从缓冲区中拾取该字符,在使用 Ctrl-C 的情况下,该驱动程序将其识别为中断字符并发送一个SIGINT
到终端的前台进程组。看n_tty.c。
请注意,tty 驱动程序仅涉及“终端”类型(命令行)接口,如 Linux 控制台、串行终端 ( /dev/ttyS*
) 和伪 tty。 GUI 系统(X11、Wayland 实现)以不同方式处理输入设备。