Kernel
鍵盤中斷如何作為程序信號結束
我正在通過 O’Reilly 的Understanding Linux Kernel學習 linux 核心,最近涵蓋了堅持一些基本 2.4 linux 版本的信號和中斷處理章節,並在我能理解的範圍內深入研究程式碼。
然而,我無法向自己解釋,也無法在其他地方找到答案,比如說,當 a
ctrl + c
被按下用於在 shell 中執行的程序時,會發生什麼指令流。到目前為止我所做的事情是:
- 一旦按下鍵盤 APIC 將 IRQ 線提升到 cpu
- 如果中斷不可屏蔽,則 cpu 載入相應的 int。來自 IDT 的處理程序
- 比,一些關鍵的int。呼叫處理程式碼,進一步處理
char
從 APIC 中的鍵盤設備寄存器到其他寄存器的按下從這裡對我來說是模糊的。
不過,我確實理解,中斷處理不在程序上下文中,而異常在,因此很容易弄清楚異常如何更新
current->thread.error_code
並current->thread.trap_no
最終呼叫force_sig
. 然而,一旦中斷處理程序被執行,如上例所示,它如何最終進入所需程序的上下文並生成信號?
就像你想的那樣,按鍵會產生中斷。中斷由中斷處理程序處理;哪個處理程序取決於硬體類型,例如 USB 鍵盤或 PS/2 鍵盤。中斷處理程序從硬體讀取關鍵程式碼並對其進行緩衝。tty 驅動程序從緩衝區中提取字元,在 Ctrl-C 的情況下,該驅動程序將其辨識為中斷字元,並將 a 發送
SIGINT
到終端的前台程序組。請參閱n_tty.c。請注意,tty 驅動程序僅涉及“終端”類型(命令行)介面,如 Linux 控制台、串列終端 (
/dev/ttyS*
) 和偽 tty。GUI 系統(X11,Wayland 實現)以不同方式處理輸入設備。