回答:
それはカーネルです。キーボードはハードウェアであり、そこで発生するすべてがカーネルを通過することに注意してください。VTスイッチングの場合、イベント自体を完全に処理し、ユーザー空間には何も渡しません(ただし、ユーザー空間プログラムがそれらに関連する切り替えが発生したことをユーザー空間プログラムに通知し、おそらくそれに影響を与えることができるioctl関連の手段があると思います。 Xは間違いないでしょう)。
カーネルにはキーマップが組み込まれています。これはで実行中に変更できloadkeys
、次で表示できますdumpkeys
。
[...]
keycode 59 = F1 F13 Console_13 F25
alt keycode 59 = Console_1
control alt keycode 59 = Console_1
keycode 60 = F2 F14 Console_14 F26
alt keycode 60 = Console_2
control alt keycode 60 = Console_2
keycode 61 = F3 F15 Console_15 F27
alt keycode 61 = Console_3
control alt keycode 61 = Console_3
[...]
カーネルソースには、このように見えるデフォルトのキーマップファイルが含まれています。3.12.2ことがありますsrc/drivers/tty/vt/defkeymap.map
。また、対応するdefkeymap.cファイルがあることに気付くでしょう(これはで生成できますloadkeys --mktable
)。処理はkeyboard.c
次set_console()
からvt.c
呼び出します(これらのファイルはすべて同じディレクトリにあります)。
» grep set_console *.c
keyboard.c: set_console(last_console);
keyboard.c: set_console(i);
keyboard.c: set_console(i);
keyboard.c: set_console(value);
vt.c:int set_console(int nr)
vt_ioctl.c: set_console(arg);
そのリストからいくつかのヒットを編集しました。最後の2行目に関数のシグネチャを見ることができます。
これらがスイッチングに関係するものです。あなたが呼び出しのシーケンスを見れば、最終的にあなたが戻ってくるまでkbd_event()
の中でkeyboard.c
。これは、モジュールのイベントハンドラーとして登録されます。
(3.12.2 drivers/tty/vt/keyboard.c
行1473)
MODULE_DEVICE_TABLE(input, kbd_ids);
static struct input_handler kbd_handler = {
.event = kbd_event, <--- function pointer HERE
.match = kbd_match,
.connect = kbd_connect,
.disconnect = kbd_disconnect,
.start = kbd_start,
.name = "kbd",
.id_table = kbd_ids,
};
int __init kbd_init(void)
{
[...]
error = input_register_handler(&kbd_handler);
したがって、kbd_event()
実際のハードウェアドライバーから何かがバブルアップしたときに呼び出される必要があります(drivers/hid/
またはから何かdrivers/input/
)。ただし、kbd_event
関数ポインタを介して登録されているため、そのファイルの外部と呼ばれることはありません。
printk
トレースの簡単な手段として、ソースに独自の行を挿入できます(stdioのprintfを含む、すべての標準Cライブラリをカーネルコードで使用できるわけではありません)。printkのものはsyslogになります。Wolfgang Mauererは、2.6カーネル、Professional Linux Kernel Architectureについてのすばらしい大きな本を執筆しました。 過去10年間の主要な開発者の1人であるGreg Kroah-Hartmanも、いろいろなことをやっています。
keyboard.c
のイベントハンドラーです。「キーボードドライバー」自体はより低いレベルになります- drivers/input/keyboard/
非USBのものにはそれらの束があります。USBのものは標準化されているので、1つしかありません(おそらくを含むdrivers/hid/usbhid/usbkbd.c
)。キーボードドライバーは、vt / keyboard.cに渡すことができるスキャンコードを生成するためのものであると推測しています(その上部にあるgetkeycode()を参照)。 Documentation/input/input.txt
いくつかのヒントがあります(驚くほど古いです、笑)。