by shigemk2

当面は技術的なことしか書かない

端末への出力

  1. ユーザプログラムが端末にwriteシステムコールを発行
  2. ユーザ空間のデータがtty.t_outqに追加
  3. tty.t_outqの先頭データをKL11レジスタに設定して端末の出力処理を開始
  4. 出力端末の動作が完了するとKL11が割り込みをかけて、割り込みハンドラはtty.t_outqにデータが残っていれば出力処理を継続

最上位ビットが1になっていたときはtimeoutを実行する

TTHIWAとTTLOWATの間でキューのデータ数を確認する

klwrite

ttwrite呼び出し

klwrite(dev)
{
    ttwrite(&kl11[dev.d_minor]);
}

ttwrite

端末への出力時にデバイスドライバから呼び出される端末共通処理関数 (データをttyoutputに丸投げする)

/*
 * Called from the device's write routine after it has
 * calculated the tty-structure given as argument.
 */
ttwrite(atp)
struct tty *atp;
{
    register struct tty *tp;
    register int c;

    tp = atp;
    if ((tp->t_state&CARR_ON)==0)
        return;
    while ((c=cpass())>=0) {
        spl5();
        /* 処理能力がレッドゾーンならすでに入っているものを出力しつつスリープ */
        while (tp->t_outq.c_cc > TTHIWAT) {
            ttstart(tp);
            tp->t_state =| ASLEEP;
            sleep(&tp->t_outq, TTOPRI);
        }
        spl0();
        /* 処理能力の範囲内ならデータをtty.t_outqに放り込む */
        ttyoutput(c, tp);
    }
    /* 端末への出力処理を開始する */
    ttstart(tp);
}