Linuxカーネルでtty_open()を呼び出すのは誰ですか?

who call tty_open() in linux kernel?


質問 written by Mark @2019-01-16 09:47:43Z

: 0 : 3 : 77

マウス、キーボード、およびジョイスティックのドライバーの場合、これらのドライバーを使用してXが「オープン」を呼び出します。

(VirtualBoxでCentOS 7(テキストモードのみ)をチェックすると、lsof / dev / input / event2(keyboard)の実行後にXが表示されませんでしたが、キーボードはまだ動作しています)

tty_open()はどうですか?

呼び出しトレースによると、シーケンスを大まかに知ることができます:(少なくとも、「sys_open」と呼ばれる誰かを知っていますhttps://bugzilla.redhat.com/show_bug.cgi?id=630464

しかし、私はまだ誰が「オープン」と呼ぶのかわかりませんか?

コメント 1

initなどの/ dev / ttynを開くプロセスは、次にgettyなどを開始します。また、vtを割り当てて開き、その上でシェルを起動するopenvtがあります。

written by Ctx @2019-01-16 09:51:59Z

回答 1 written by Nominal Animal @2019-01-16 10:32:25Z
2

CentOS 7、テキストモードのみをVirtualBoxでチェックすると、lsof / dev / input / event2(キーボード)を実行した後Xが表示されませんでしたが、キーボードは引き続き動作します

これは、 /dev/ttyNデバイスの1つである仮想コンソールを使用するためです。 これらは、カーネル自体の内部のLinux入力イベントサブシステムに直接接続されます( vtモジュールによって)。 基本的に、すべてのキーボードのようなデバイスは、現在アクティブな仮想端末への入力として機能します。

X自体が仮想コンソールを使用するのは、カーネルがそれとテキストベースの仮想コンソールを切り替えることができるようにするためです。

tty_open()どうですか?

sudo lsof /dev/tty[0-9]を実行すると、仮想コンソールにアクセスしているプロセスを確認できます。

名前にgettyが含まれるプロセスは、ログイン端末を提供するプロセスです。 (シリアル端末で使用されるものは非常によく似ています。実際、多くのgettyプログラムは仮想コンソールとシリアル端末の両方を問題なく処理できます。)ログインすると、そのgettyはlogin (プログラム!)を起動しlogin 。そのユーザー用に定義されたデフォルトのシェル( getent passwd username参照してください。これは最後のフィールドであり、許可するには/etc/shellsにリストされているものでなければなりません)。

カーネル自体は、 Ctrl + Alt + Fn (tty1の場合はF1、tty2の場合はF2など)による別の仮想コンソールへの切り替えをサポートしています 適切なグラフィックドライバーを使用すれば、Xorgと仮想コンソールを切り替えることもできます。 (通常、Xorgはtty6またはtty7で実行されますが、配布ごとに異なります。) Ctrl + Alt + およびCtrl + Alt + は通常、前または次の仮想コンソールに切り替えるためにも使用できます。

回答 2 written by Mark @2019-01-17 06:10:58Z
0

情報を提供してくれたNominal Animalに感謝します。

Linux 2.0( https://mirrors.edge.kernel.org/pub/linux/kernel/v2.0/ )をトレースしていますが、少し異なるかもしれません。 申し訳ありませんが、リンクリファレンスへのオンラインLinux 2.0ソースが見つかりません。

キーボードの場合、テキストモードでは、カーネルで 'open'を呼び出す人はいないと思います。'inttty_init(void) '(tty_io.c)では、' kbd_init(); 'を呼び出します。 次に見ることができます:

request_irq(KEYBOARD_IRQ, keyboard_interrupt, 0, "keyboard", NULL);

したがって、キーボードHWはこのIRQとコールバック( 'keyboard_interrupt')で動作できます。

tty_open()については、main.cで最終的に確認できます。