文字リストの構造

キャラクター・デバイス・ドライバー、および一度に入出力を実行できるその他のキャラクター・オリエンテッド・サポートは、サービスとデータ・バッファーの共通セットを使用して実装し、 文字リストの形式で文字を処理することができます。 文字リスト は、文字のリストまたはキューです。 一部のルーチンは文字をリストに入れ、その他のルーチンは文字をリストから除去します。

クライストと呼ばれる文字リストには、 クリスト ヘッダーと、文字ブロックと呼ばれる 1 つ以上のデータ・バッファーのチェーン. が含まれています。 キューに文字を書き込むと、共通プールからスペース (文字ブロック) が割り振られ、文字ブロックが文字キューを定義するデータ構造にリンクされます。 キューから文字を取得すると、対応するスペースがプールに戻されます。

キャラクタ・リストは、キャラクタ・デバイス・ドライバの上半分と下半分の間の通信に使用できる。 クリスト ヘッダーと、これらのルーチンによって使用される文字ブロックは、 割り込み環境でアクセスされるため、メモリー内に固定する必要があります。

文字リスト・サービスのユーザーは、一度に使用する文字ブロックの数を (通常はデバイス・ドライバーの DDOPEN ルーチンに) 登録する必要があります。 これにより、カーネルは、文字ブロック・プール内の固定文字ブロックの数を管理することができます。 同様に、使用が終了した場合 (例えば、デバイス・ドライバーがクローズされた場合)、使用ルーチンは文字ブロックの登録を除去する必要があります。 ピンクフ カーネル・サービスは、文字ブロックを使用するための登録を提供します。

カーネルは、文字リストから文字または文字ブロックを取得するために、 GetCgetcbgetcbp、および GetCX カーネル・サービスの 4 つのサービスを提供します。 文字リストに文字または文字ブロックを追加する 4 つのサービス ( PTCパットカーブ書き込み BP、および PUTCX カーネル・サービス) もあります。 getcf カーネル・サービスはフリー文字ブロックを割り振りますが、 プット CF カーネル・サービスはフリー・リストに文字ブロックを返します。 さらに、 プット CFL カーネル・サービスは、文字バッファーのリストをフリー・リストに返します。 ウェイトフリー カーネル・サービスは、フリー・リストに文字ブロックがあるかどうかを判別し、使用可能な文字ブロックがない場合は待機します。

文字リストの使用

使用する文字リストごとに、 クリスト ヘッダー構造体を割り振る必要があります。 この clist 構造は、 /usr/include/sys/cblock.h ファイルに定義されています。

クリスト ヘッダー内のフィールドを保守する必要はありません。これは、文字リスト・サービスによって保守されるためです。 ただし、以下を初期化する必要があります。c_ccカウント・フィールドを 0 に、および両方の文字ブロック・ポインター (c_cfおよびc_cl) クリスト ヘッダーを初めて使用する前に NULL に設定します。 クリスト 構造は、これらのフィールドを定義します。

文字リスト内の各バッファーは、 /usr/include/sys/cblock.h ファイルにも定義されている cblock 構造体です。

文字ブロック・データ域は、文字で完全に埋める必要はありません。 最初の c_first および 最後の c_last フィールドは、 C_ データ 配列内のゼロ・ベースのオフセットであり、実際にはデータが含まれます。

文字バッファーには、限られた量のメモリーしか使用できません。 すべてのキャラクター・ドライバーは、このバッファー・プールを共用します。 したがって、文字リストの文字数を数百に制限する必要があります。 装置がクローズされると、デバイス・ドライバーは、バッファーがフリー・バッファーのリストに戻されるように、すべての文字リストがフラッシュされるようにする必要があります。