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を設定する事で実現しています。
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となっているはずです。(たぶん)


最終更新 2012/01/30 16:30:38 - north
(2012/01/30 16:30:38 作成)


検索

アクセス数
3689430
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。