input_handlerに処理を渡しています。しているのでこのファイルがキーボードの入力イベントを処理しているようです。いうわけでevent関数として設定されているkbd_event()→kbd_keycode()を眺めると、各キー入力に対してハンドラが呼ばれてるっぽいということがわかります。key_mapsでgrepをかけたところ、drivers/char/defkeymap.c_shippedがひっかかりました。実際の入力を考えないとわからないので'1'を入力したとしましょう。plain_mapの3番目の0xf031が選択されるのでしょう。いうわけでk_handlerを見るとk_selfが実行されることがわかります。k_self()→k_unicode()と進んで、キーボードがユニコードモードかで分岐してますがどちらにしろ最後はput_queue()に行き着いています。tty_insert_flip_char()はinclude/linux/tty_flip.hに書かれています。con_schedule_flip()はinclude/linux/kbd_kern.hに書かれています。いうわけで、以降の処理は遅延実行されるみたいです。ttyの処理をやってそうなコードを探すとdrivers/char/tty_io.cが見つかります。その中でtty_struct.buf.workを初期化しているコードを探すとinitialize_tty_struct()で初期化されていました。flush_to_ldiscに進む前にinitialize_tty_structが呼ばれるまでを確認します。次に、tty_openはtty_fopsのopenとして指定されています。もって、tty_fopsは/dev/ttyに関連付けられています。それではflush_to_ldiscを眺めます。いうわけでtty_ldisc_N_TTYが設定されているようです。tty_ldisc_N_TTYはdrivers/char/n_tty.cにあります。receive_bufに設定されているn_tty_receive_bufを見ると、いろいろやってますが、ttyのバッファに入力文字が格納されるということでいいでしょう。進んでバッファに格納された値が読み込まれるようです。なんかread_chan()かなり長いんですけど本質的なことはそんなところでしょう。今回はキーボード入力をLinuxがどのように処理しているか見てきました。わかったこととしては以下のことがあります。これで、GUIからトップダウンに眺めてきたキーボード入力の旅は終わりです。それではみなさんもよいコードリーディングを。