現在の端末を変更するためにこのキーの組み合わせを押すと、Linuxで何が起こるのかを説明しています。特に、どのソフトウェアコンポーネントがこのキーの組み合わせを傍受して端末を変更しますか?カーネルですか?カーネルの場合、この問題を処理するソースファイルの場所を提供できますか?
編集:グラフィック(X11)とテキストベースの環境でどのように機能するかを知りたいです。
ベストアンサー1
これが重要です。キーボードはハードウェアであり、ここで起こるすべてはカーネルを通過します。 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
(これらのファイルはすべて同じディレクトリにあります)callset_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.2drivers/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
カーネル検証のためのいくつかのリソース
- これLinux相互参照識別子の検索素晴らしいツールです。
- これ対話型Linuxカーネル図相互参照ツールのための興味深いグラフィックフロントエンド。
- 少なくとも1995年までさかのぼるLKML(Linux Kernel Mailing List)の広範な記録アーカイブがあり、その一部はメンテナンスされず、検索機能が破損しています。ゲルマンNo.1とてもうまくいくようです。開発者間の主要なコミュニケーション手段であるメーリングリストに多くの人々が質問します。
printk
単純なトレース方法を使用して独自の行をソースコードに挿入できます(stdioのprintfを含むすべての標準Cライブラリをカーネルコードで使用できるわけではありません)。 printkの内容は最終的にsyslogに表示されます。
Wolfgang Mauererは2.6カーネルに関する素晴らしい本を書いた。プロのLinuxカーネルアーキテクチャ、それは多くのソースを経ます。 グレッグ・クロハットマン過去10年間で主要開発者の一人であり、多くのことが進められています。