端末のオープン処理を行うデバイスドライバである。
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にキャストしてる?