Ctrl + Alt + Fを押すとどうなりますか?抑圧されていますか?

Ctrl + Alt + Fを押すとどうなりますか?抑圧されていますか?

現在の端末を変更するためにこのキーの組み合わせを押すと、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年間で主要開発者の一人であり、多くのことが進められています。

おすすめ記事