
私はLinuxカーネルを扱っており、O'Reillyのカーネルについて知っています。Linuxカーネルについて学ぶ最近では、シグナルと割り込み処理の章をカバーし、いくつかの基本的な2.4 Linuxバージョンを使用して理解できる点までコードを掘り下げました。
ctrl + c
ただし、シェルで実行されているプロセスを制御するためにaを押したときにコマンドフローに何が起こるのかを自分で説明することも、他の場所で答えを見つけることもできません。
これまで私がしたこと:
- キーボードを押すと、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実装)は入力デバイスを異なる方法で処理します。