by shigemk2

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

klopen()

端末のオープン処理を行うデバイスドライバである。

openシステムコールを発行うるとklopenが実行される。

該当端末のアドレスを算出して、tty構造体とレジスタの初期設定を行う。

klopen(dev, flag)
{
    register char *addr;
    register struct tty *tp;

    if(dev.d_minor >= NKL11+NDL11) { /* #define   NKL11   1 #define   NDL11   0 */
        u.u_error = ENXIO;
        return;
    }
    tp = &kl11[dev.d_minor];
    if (u.u_procp->p_ttyp == 0) {
        u.u_procp->p_ttyp = tp;
        tp->t_dev = dev;
    }
    /* レジスタのベースアドレスを計算する */
    /* マイナー番号によって割り振り方が変わる */
    /*
    * set up minor 0 to address KLADDR
    * set up minor 1 thru NKL11-1 to address from KLBASE
    * set up minor NKL11 on to address from DLBASE
    */
    addr = KLADDR + 8*dev.d_minor;
    if(dev.d_minor)
        addr =+ KLBASE-KLADDR-8;
    if(dev.d_minor >= NKL11)
        addr =+ DLBASE-KLBASE-8*NKL11+8;
    tp->t_addr = addr;
    /* 端末の状態をチェック */
    if ((tp->t_state&ISOPEN) == 0) {
        /* tty構造体の初期化 */
        tp->t_state = ISOPEN|CARR_ON;
        tp->t_flags = XTABS|LCASE|ECHO|CRMOD;
        tp->t_erase = CERASE; /* # */
        tp->t_kill = CKILL; /* @ */
    }
    addr->klrcsr =| IENABLE|DSRDY|RDRENB;
    addr->kltcsr =| IENABLE;
}

ISOPENとCARR_ONの違いはなんぞや

klopen実行

  • エラーチェック
  • アドレス割り当てチェック
  • アドレス割り当て
  • tty初期化
  • レジスタにフラグをセット

devの型はintで、intにキャストしてる?