ttyとtty0の違い
ttyはカレントコンソール、tty0アクティブコンソールと言う事ですが、これだけの説明だと、カレントコンソールとは一体なんなのか?と言う事です。ALT+FUNキー下で仮想コンソールが切り替わるわけですが、この時カレントコンソールが切り替わるのか、それともアクティブコンソールが切り替わるのか。
結論から言うと、このカレントコンソールとは、カレントプロセスのコンソールという事です。(カーネルの世界ではカレントと言えば、カレントプロセスと言うのが常識なのでしょうか?)
現象面の違いとしては、アクティブコンソールコンソールからプロセスを起動します。このプロセスの端末は、シェルのコンソールを引き継ぐ事で、アクティブコンソールコンソールが割り当てられます。
プロセスがttyに出力するとします。ttyはカレントプロセスコンソールですから画面に表示されます。しかし出力する前にsleepして、ALT+FUNでアクティブコンソールを切り替えたといたします。出力先はプロセスのttyですから、プロセスのコンソールは、先のアクティブコンソールであり、そこに出力される事になります。現在の画面上に表示されません。
プロセスがtty0に出力するとします。tty0はアクティブコンソールですから、画面が切り替わろうと問題なく表示されるという事です。
コンソール入出力は、プロセスのFILE構造体のインデックス0,1に、そのデバイスファイルのinodeとして設定されています。これはデバイスファイルオープンの処理でのコールバック関数として、 file_operations tty_fopsのopenメンバー(tty_open関数)がコールされ、デバイスのメジャー/マイナー番号に対応するttyを設定する事で実現しています。
MKDEV(TTYAUX_MAJOR, 0)はttyです。この時get_current_tty()で、current->signal->ttyをttyドライバとしています。
MKDEV(TTY_MAJOR, 0)はtty0です。console_driverは、複数のコンソールドライバが設定できるような配列で、ここではその先頭と言うことです。ttyはconsole_driverに登録された、最初の物が使われると言うことのようです。そして指定されたコンソールドライバーに紐付くttyドライバが決定されるわけです。この時決定するttyドライバのインデックスを、fg_consoleとしています。この変数はALT+FUNで画面を切り替わるたびに、切り替わったコンソールの番号が設定されています。
/dev/consoleはアクティブのコンソールです。通常コンソールは1つで、/dev/ttyとなっているはずです。(たぶん)
結論から言うと、このカレントコンソールとは、カレントプロセスのコンソールという事です。(カーネルの世界ではカレントと言えば、カレントプロセスと言うのが常識なのでしょうか?)
現象面の違いとしては、アクティブコンソールコンソールからプロセスを起動します。このプロセスの端末は、シェルのコンソールを引き継ぐ事で、アクティブコンソールコンソールが割り当てられます。
プロセスがttyに出力するとします。ttyはカレントプロセスコンソールですから画面に表示されます。しかし出力する前にsleepして、ALT+FUNでアクティブコンソールを切り替えたといたします。出力先はプロセスのttyですから、プロセスのコンソールは、先のアクティブコンソールであり、そこに出力される事になります。現在の画面上に表示されません。
プロセスがtty0に出力するとします。tty0はアクティブコンソールですから、画面が切り替わろうと問題なく表示されるという事です。
コンソール入出力は、プロセスのFILE構造体のインデックス0,1に、そのデバイスファイルのinodeとして設定されています。これはデバイスファイルオープンの処理でのコールバック関数として、 file_operations tty_fopsのopenメンバー(tty_open関数)がコールされ、デバイスのメジャー/マイナー番号に対応するttyを設定する事で実現しています。
crw-rw-rw-. 1 root tty 5, 0 2012-01-24 08:09 /dev/tty crw-------. 1 root root 5, 1 2012-01-24 08:09 /dev/console crw-rw-rw-. 1 root tty 5, 2 2012-01-24 08:45 /dev/ptmx crw-r--r--. 1 root root 4, 0 2012-01-24 08:09 /dev/systty crw--w----. 1 root tty 4, 0 2012-01-24 08:09 /dev/tty0 crw--w----. 1 root tty 4, 1 2012-01-24 08:11 /dev/tty1 crw--w----. 1 root tty 4, 2 2012-01-24 08:09 /dev/tty2 : :
MKDEV(TTYAUX_MAJOR, 0)はttyです。この時get_current_tty()で、current->signal->ttyをttyドライバとしています。
MKDEV(TTY_MAJOR, 0)はtty0です。console_driverは、複数のコンソールドライバが設定できるような配列で、ここではその先頭と言うことです。ttyはconsole_driverに登録された、最初の物が使われると言うことのようです。そして指定されたコンソールドライバーに紐付くttyドライバが決定されるわけです。この時決定するttyドライバのインデックスを、fg_consoleとしています。この変数はALT+FUNで画面を切り替わるたびに、切り替わったコンソールの番号が設定されています。
#define TTY_MAJOR 4 #define TTYAUX_MAJOR 5 static int __tty_open(struct inode *inode, struct file *filp) { dev_t device = inode->i_rdev; : if (device == MKDEV(TTYAUX_MAJOR, 0)) { tty = get_current_tty(); if (!tty) { mutex_unlock(&tty_mutex); return -ENXIO; } driver = tty->driver; index = tty->index; filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */ goto got_driver; } #ifdef CONFIG_VT if (device == MKDEV(TTY_MAJOR, 0)) { extern struct tty_driver *console_driver; driver = console_driver; index = fg_console; noctty = 1; goto got_driver; } #endif : } struct tty_struct *get_current_tty(void) { struct tty_struct *tty; WARN_ON_ONCE(!mutex_is_locked(&tty_mutex)); tty = current->signal->tty; barrier(); return tty; }
補足
ttyをプロセスに関連づけるというのは、filp->private_data = tty 選択したttyドライバを、プロセスのFILE構造体のprivate_dataに、また選択されたtty側にもロセスのFILE構造をリストする事です。tty側にもリストするのは、入力時の処理のためです。tty側で入力があると、そこにリストされているFILE構造体のプロセスを起床させる事で、入力データをプロセスに渡しています。/dev/consoleはアクティブのコンソールです。通常コンソールは1つで、/dev/ttyとなっているはずです。(たぶん)