コンソールは、シリアルポートや仮想的なコンソールを経由して、 文字の入出力を標準的に行うための機構であり、 システム全体として以下の構成となる。

コンソールドライバは、コンソールとしての機能を実現するドライバであり、 シリアル I/O ドライバは、実際のシリアルポートに対する入出力を行うためのドライバである。
アプリケーションは、 標準入出力ライブラリやコンソールライブラリを経由してコンソールドライバを使用することになり、 コンソールがシリアルポートに接続されているときは、 さらに、シリアル I/O ドライバが使用される。
アプリケーションが、通常のデバイスとして直接シリアルポートを使用するときは、 デバイス管理、RS232C ドライバを経由して、シリアル I/O ドライバが使用される。
コンソールは、一般のデバイスドライバとは異なった構造を持ち、 コンソール機能のための専用のシステムコール ( 拡張 SVC ) が用意されている。
システムは複数のコンソールを持つことができ、 それぞれのコンソールは動的に生成され、 コンソールポート番号により識別される。
コンソールは、以下の属性を持つ。
CONF )
    コンソールの種別を示す以下のいずれかであり、生成時に指定される。
CONF_SERIAL シリアルポート
     CONF_SELF   セルフコンソール
     CONF_BUFIO  バッファ I/O
     
SNDTMO )RCVTMO )RCVBUFSZ )SNDBUFSZ )ECHO )MINPUT )CANONICAL モード)。
    NEWLINE )FLOWC )IXON  | XON / XOFF 出力フロー制御 | 
IXANY | IXON 時に任意文字の受信で出力を再開 | 
IXOFF | XON / XOFF 入力フロー制御 | 
コンソールポート番号は 1〜 の番号であり、通常、システム立ち上げ時に、 以下のコンソールが生成される。
CONF = CONF_SERIAL (シリアルポート #0) SNDTMO = -1 RCVTMO = -1 RCVBUFSZ = デフォールト SNDBUFSZ = デフォールト ECHO = 1 INPUT = EDIT NEWLINE = 1 FLOWC = IXON | IXOFF
CONF = CONF_SERIAL (シリアルポート #0) SNDTMO = -1 RCVTMO = -1 RCVBUFSZ = デフォールト SNDBUFSZ = デフォールト ECHO = 0 INPUT = CANONICAL NEWLINE = 0 FLOWC = 0
プロセスには、1 つのコンソールが割り当てられ、子プロセスに引き継がれる。 デフォールトでは、ポート番号 = 1 のデバッグ用コンソールが割り当てられるが、 このポート番号を変更して、別のコンソールを割り当てることができる。
標準入出力ライブラリでは、自プロセスに割り当てられたコンソールが対象となる。 ただし、非プロセスのタスクではポート番号 = 1 のデバッグ用コンソールが対象となる。
また、syslog() による出力も、ポート番号 = 1 のデバッグ用コンソールが対象となる。
#define CONSOLE_PORT 1 /* デバッグ用コンソール */ #define RS_PORT 2 /* 標準 RS ポート */
cons_ioctl() コマンド
#define GETCTL 0x100 /* 設定取り出し */ #define ECHO 1 /* エコーの有無 (0:無、1:有) */ #define INPUT 2 /* 入力モード (RAW, etc) */ #define NEWLINE 3 /* 出力改行変換 (0:変換しない,1: する) */ #define FLOWC 4 /* フロー制御 (0: 無, IXON, etc) */ #define SNDTMO 0x81 /* 送信タイムアウト(ミリ秒) -1: なし */ #define RCVTMO 0x82 /* 受信タイムアウト(ミリ秒) -1: なし */ #define RCVBUFSZ 0x83 /* 入力バッファサイズ: GET のみ */ #define SNDBUFSZ 0x84 /* 出力バッファサイズ: GET のみ */
#define RAW 1 /* 1 文字ずつの生入力 */ #define CANONICAL 3 /* 1 行入力 (CR を LF に変換) */ #define EDIT 5 /* 1 行編集入力 */
#define IXON 0x01 /* XON / XOFF 出力フロー制御 */ #define IXANY 0x02 /* IXON 時に任意文字の受信で出力を再開 */ #define IXOFF 0x04 /* XON / XOFF 入力フロー制御 */
cons_conf() コマンド
#define CS_CREATE 0x11 /* コンソールの生成 */ #define CS_DELETE 0x12 /* コンソールの削除 */ #define CS_SETCONF 0x13 /* コンソール構成の設定 */ #define CS_GETCONF 0x14 /* コンソール構成の取り出し */ #define CS_GETPORT 0x21 /* 標準コンソールの取り出し */ #define CS_SETPORT 0x22 /* 標準コンソールの設定 */ #define CS_SRCHPORT 0x23 /* コンソールポートのサーチ */
#define CONF_SERIAL_0 (0) /* シリアルポート # 0 */ #define CONF_SERIAL(n) (n) /* シリアルポート # N */ #define CONF_SELF (-1) /* セルフコンソール */ #define CONF_BUFIO (-2) /* バッファ I/O */
コンソールを取り扱うための以下のサービスが拡張システムコールとして提供される。
  | 
    W   console_in(W port, B *buf, UW len)
port | コンソールポート番号 | 
buf  | 入力データバッファ | 
len  | 入力する最大データバイト長さ | 
| > 0 | 実際に入力したバイト数 | 
| = 0 | 1 バイトも入力できなかった | 
| = -1 | 入力が中断された (入力モードが EDIT モードのときのみ) | 
  port で指定したコンソールから、最大 len バイトのデータを入力して、
  buf に格納する。実際に入力したバイト数をリターン値として戻す。
指定したコンソールの入力モードにより以下の動作となる。
len バイトのデータを入力した時点でリターンする。
      len == 1 のとき :
 len バイトのデータを入力した時点でリターンする。
      buf に格納される。
      len > 1 のとき :
 len は 1 行の編集入力が可能だけ十分
          大きくなくてはいけない。
      buf に格納される。
      buf には格納されない。
      なし
  | 
    ERR console_out(W port, B *buf, UW len)
port | コンソールポート番号 | 
buf  | 出力データバッファ | 
len  | 出力するデータバイト長さ | 
| > 0 | 実際に出力したバイト数 | 
| = 0 | 1 バイトも出力できなかった | 
  port で指定したコンソールに、buf 内の len
  バイトのデータを出力して、実際に出力したバイト数をリターン値として戻す。
指定したコンソールに設定されている出力タイムアウト以内にデータを出力できなかったときは、 その時点でリターンする。
出力改行変換ありのときは、LF は CR、LF に変換して出力される。
なし
  | 
    W   console_ctl(W port, W req, W arg)
port | コンソールポート番号 | 
req  | コマンド | 
arg  | コマンドパラメータ | 
| 任意 | 取り出した現在の設定値 | 
| = 0 | 設定を行った | 
| = -1 | エラー | 
port で指定したコンソールに対して、req で指定した以下の動作を行う。
ECHO | GETCTL 現在の ECHO モードを取り出す。(arg は未使用) ECHO arg を ECHO モードに設定する。 INPUT | GETCTL 現在の INPUT モードを取り出す。(arg は未使用) INPUT arg を INPUT モードに設定する。 NEWLINE | GETCTL 現在の NEWLINE モードを取り出す。(arg は未使用) NEWLINE arg を NEWLINE モードに設定する。 FLOWC | GETCTL 現在の FLOWC モードを取り出す。(arg は未使用) FLOWC arg を FLOWC モードに設定する。 SNDTMO | GETCTL 現在の SNDTMO を取り出す。(arg は未使用) SNDTMO arg を SNDTMO に設定する。(arg < 0 は -1) RCVTMO | GETCTL 現在の RCVTMO を取り出す。(arg は未使用) RCVTMO arg を RCVTMO に設定する。(arg < 0 は -1) RCVBUFSZ | GETCTL 現在の RCVBUFSZ を取り出す。(arg は未使用) SNDBUFSZ | GETCTL 現在の SNDBUFSZ を取り出す。(arg は未使用)
なし
  | 
    W   console_get(W port, B *buf, UW len, W tmout)
port | コンソールポート番号 | 
buf  | 読み込みデータバッファ | 
len  | 読み込み最大データバイト長さ | 
tmout | タイムアウト(ミリ秒) | 
| > 0 | 実際に読み込んだバイト数 | 
| = 0 | 1 バイトも読み込みできなかった | 
port で指定したバッファ I/O 種別のコンソールから、
最大 len バイト読み込んで、
buf に格納し、実際に読み込んたバイト数をリターン値として戻す。
読み込んだデータは、console_out() によって出力されたデータとなる。
コンソールの出力バッファが空になったとき、以下の動作となる。
tmout = 0 :  | 
       待たずにリターンする。 | 
tmout = -1 :  | 
       出力バッファにデータがくるまで永久に待つ。 | 
tmout > 0 : | 
       出力バッファがデータがくるまで最大 tmout ミリ秒だけ待つ。 | 
コンソールの種別がバッファ I/O でないときは何もせずに 0 を戻す。
なし
  | 
    ERR console_put(W port, B *buf, UW len, W tmout)
port | コンソールポート番号 | 
buf  | 書き込みデータバッファ | 
len  | 書き込みデータバイト長さ | 
tmout | タイムアウト(ミリ秒) | 
| > 0 | 実際に書き込んだバイト数 | 
| = 0 | 1 バイトも書き込みできなかった | 
port で指定したバッファ I/O 種別のコンソールに、buf 内の len
バイトのデータを書き込んで、実際に書き込んだバイト数をリターン値として戻す。
書き込んだデータは、console_in() によって入力されるデータとなる。
コンソールの入力バッファが一杯になったとき、以下の動作となる。
tmout = 0 :  | 
       待たずにリターンする。 | 
tmout = -1 :  | 
       入力バッファが空くまで永久に待つ。 | 
tmout > 0 : | 
       入力バッファが空くまで最大 tmout ミリ秒だけ待つ。 | 
コンソールの種別がバッファ I/O でないときは何もせずに 0 を戻す。
なし
  | 
    ERR console_conf(W req, UW *arg)
req | コマンド | 
arg | コマンドパラメータ | 
| = 0 | 正常終了 | 
| = -1 | エラー | 
  コンソールの生成、変更などの req で指定した以下の動作を行う。
CS_CREATE コンソールの生成
 arg[0] = ポート番号 OUT arg[1] = 種別 IN arg[2] = 入力バッファサイズ IN arg[3] = 出力バッファサイズ IN
arg[1〜3] で指定したコンソールを新規に生成する。arg[0] に戻る。CS_DELETE コンソールの削除
 arg[0] = ポート番号 IN
arg[0] で指定したコンソールを削除する。
  CS_SETCONF
  arg[0] = ポート番号 IN arg[1] = 種別 IN arg[2] = 入力バッファサイズ IN arg[3] = 出力バッファサイズ IN
arg[0] で指定したコンソールの構成を、
   arg[1〜3]で指定した内容に変更する。CS_GETCONF
 arg[0] = ポート番号 IN arg[1] = 種別 OUT arg[2] = 入力バッファサイズ OUT arg[3] = 出力バッファサイズ OUT
arg[0] で指定したコンソールの現在の構成を
        arg[1〜3] に戻す。
 CS_GETPORT
 arg[0] = ポート番号 OUT現在、自プロセスに設定されているコンソールの ポート番号を
arg[0] に戻す。
 CS_SETPORT
 arg[0] = ポート番号 IN自プロセスのコンソールを
arg[0] で指定したポート番号のコンソールに変更する。CS_SRCHPORT
 arg[0] = ポート番号 IN/OUT arg[1] = コンフィグレーション IN
arg[1] で指定したコンフィグレーションに一致し、arg[0] で指定したポート番号より大きなポート番号を持つコンソールポートを見つける。arg[0] にポート番号( > 0)を戻し、見つからなかった場合は、関数値に 0 を戻す。
なし
コンソール、および低レベルシリアルに対する操作は、通常は、 システムコールを直接使用するのではなく、以下のライブラリを使用して行う。
  | 
    int _PutString(char *buf)
buf | 出力する文字(バイト)列 | 
| = 0 | 実際に出力した文字(バイト)数 | 
| = -1 | 1 文字(バイト)も出力できなかった | 
  現在、自プロセスに割り当てられているコンソールへ buf 内の文字列を出力する。
  文字列は 0 で終了していなくてはいけない。
  このライブラリでは console_out() を使用する。
printf() などの標準入出力ライブラリでの出力は、
このライブラリを使用して行われる。
  | 
    int _PutChar(int c)
| c | 出力する文字(バイト) | 
| = 1 | 出力した | 
| = -1 | 出力できなかった | 
現在、自プロセスに割り当てられているコンソールへ c で指定した 1 文字を出力する。 c の下位バイトのみ有効となる。
このライブラリでは console_out() を使用する。
putchar() などの標準入出力ライブラリでの出力は、このライブラリを使用して行われる。
  | 
    int _GetString(char *buf)
buf | 入力した文字(バイト)列の格納領域 | 
| > 0 | 実際に入力したバイト数 | 
| = 0 | 1 バイトも入力できなかった | 
| = -1 | 入力が中断された (入力モードが EDIT モードのときのみ) | 
現在、自プロセスに割り当てられているコンソールから 1 行入力して buf に格納する。
buf は十分な大きさを持っていなくてはいけない。
buf の最後には 0 が格納され、
最後に入力された LF コード は格納されない。
実際の入力はコンソールに設定されている入力モードにしたがって行われるため、 RAW モードのときは、1 行ではなく 1 文字ずつの入力となる。
このライブラリでは console_in() を使用する。
gets() などの標準入出力ライブラリでの入力は、このライブラリを使用して行われる。
  | 
    int _GetChar()
なし
| > 0 | 入力した文字(バイト) | 
| = -1 | 入力できなかった | 
現在、自プロセスに割り当てられているコンソールから 1 文字入力して、リターン値として戻す。
実際の入力はコンソールに設定されている入力モードにしたがって行われる。
このライブラリでは console_in() を使用する。
getchar() などの標準入出力ライブラリでの入力は、このライブラリを使用して行われる。
  | 
    int cons_ioctl(int req, int arg)
req | コマンド | 
arg | コマンドパラメータ | 
| 任意 | 取り出した現在の設定値 | 
| = 0 | 設定を行った | 
  現在、自プロセスに割り当てられているコンソールに対して、
  req、arg で指定した制御動作を行う。
  このライブラリでは console_ctl() を使用する。
  | 
    int RS_putchar(int c)
int | 出力する文字(バイト) | 
| = 1 | 出力した | 
| = -1 | 出力できなかった | 
標準 RS ポートへ c で指定した 1 文字を出力する。 c の下位バイトのみ有効となる。
  このライブラリでは console_out() を使用する。
  | 
    int RS_getchar()
なし
| > 0 | 入力した文字(バイト) | 
| = -1 | 入力できなかった | 
標準 RS ポートから 1 文字を入力して、リターン値として戻す。
このライブラリでは console_in() を使用する。
  | 
    int RS_ioctl(int req, int arg)
req | コマンド | 
arg | コマンドパラメータ | 
| 任意 | 取り出した現在の設定値 | 
| = 0 | 設定を行った | 
  標準 RS ポートに対して、req、arg で指定した制御動作を行う。
このライブラリでは console_ctl() を使用する。
  | 
    W   cons_put(W port, B *buf, UW len, W tmout)
console_put(port, buf, len, tmout) を実行する。
  | 
    W   cons_get(W port, B *buf, UW len, W tmout)
console_get(port, buf, len, tmout) を実行する。
  | 
    W   cons_conf(W req, UW *arg)
console_conf(req, arg) を実行する。
画面上の仮想的なコンソールを実現するアプリケーションは、一般に以下のような処理を行う。
arg[1] = CONF_BUFIO cons_conf(CS_CREATE, arg)
cons_conf(CS_SETPORT, arg)
以後、生成した子プロセスには、このバッファ I/O コンソールが割り当てられる。
cons_get(arg[0],..) で取り出したデータを画面に表示する。
       cons_put(arg[0],..) により設定して、
           子プロセスへの入力とする。
      cons_conf(CS_DELETE, arg)
生成した子プロセスのコンソールはそのままのため、生成した子プロセスも基本的に終了させること。