buf 構造

目的

プログラムと周辺装置との間のデータ転送のバッファリングについて説明します。

カーネル・バッファーの概要

ブロック・デバイスの場合、カーネル・バッファーは、プログラムと周辺装置の間のデータ転送をバッファーに入れるために使用されます。 これらのバッファーは、4096 バイトのブロック単位で割り振られます。 どの時点においても、各メモリー・ブロックは、デバイス・ドライバーとカーネルが維持する以下の 2 つのリンク・リストのいずれかのメンバーです。

リスト 説明
使用可能なバッファー・キュー (avlist) 使用可能なすべてのバッファーのリスト。 これらのバッファーには、装置との間で転送を待機しているデータは含まれません。
ビジー・バッファー・キュー (blist) 装置との間で転送を待機しているデータを含むすべてのバッファーのリスト。

各バッファーには、それを指す ブフ 構造体と呼ばれるバッファー・ヘッダーが関連付けられています。 各バッファー・ヘッダーにはいくつかの部分があります。

  • ブロックに関する情報
  • 状況情報を表示するためのフラグ
  • ビジー・リストの順方向ポインターと逆方向ポインター
  • 使用可能リストの順方向ポインターと逆方向ポインター

デバイス・ドライバーは、av_forwおよびav_backポインター (使用可能ブロックの場合) を保持しながら、カーネルはb_forwおよびb_backポインター (使用中ブロックの場合)。

ブロック入出力の buf 構造変数

/usr/include/sys/buf.h ファイルに定義されている buf 構造体には、以下のフィールドが含まれています。

項目 説明
b_flags フラグ・ビット。 このフィールドの値は、以下の値の 1 つ以上を論理 OR することによって構成されます。
書き込み (_WRITE)
この操作は書き込み操作です。
読み取り (B)
この操作は、書き込みではなく、データ読み取り操作です。
完了 (_D)
バッファー上の入出力が行われたため、バッファー情報は他のバージョンよりも最新です。
B_ エラー
転送エラーが発生し、トランザクションが異常終了しました。
B_ ビジー
ブロックがフリー・リストにありません。
B_ 未完了
この入出力要求は、処理のために物理デバイス・ドライバーに送信されました。
ページ (_AGE)
データがすぐに再利用される可能性は低いため、このバッファーを再利用することをお勧めします。 このフラグは、バッファーが末尾ではなくフリー・リストの先頭にあることを示します。
非同期 (_ASYNC)
このブロックに対して非同期入出力が実行されています。 入出力が完了したら、ブロックを解放します。
B_DELWRI (B)
このブロックがフリー・リストにあっても、バッファーを再利用する前に、このバッファーの内容を書き出す必要があります。 これは、同じブロックへの別の書き込みがすぐに行われることをシステムが予期している場合に、 書き込み サブルーチンによって使用されます。
非 IDE (_NOHIDE)
直接メモリー・アクセス (DMA) 転送中にデータ・ページを非表示にしないことを示します。
B_ 設定
拡張入出力ファイル・システムにより、ページが変更されたと見なされるようにします。
不整合 (_S)
入出力エラーのため、データがディスク上のデータと競合しています。
B_ XREADONLY (読み取り専用)
外部ページャー・バッファー・リスト内の読み取り専用ページを示します。
完了 (_MORE_DONE)
設定されている場合、この ブフ 構造体の受信側に対して、 IODONE 社 レベルでさらに多くの構造体がキューに入れられることを示します。 これにより、デバイス・ドライバーは、新しい要求を処理する前に、完了したすべての要求を処理することができます。
分割 (_S)
設定されている場合、データ・バッファー内の任意の場所から転送を開始できることを示します。
b_forw 順方向ビジー・ブロック・ポインター。
b_back 逆方向使用中ブロック・ポインター。
av_forw ドライバー要求キューの順方向ポインター。
av_back ドライバー要求キューの逆方向ポインター。
b_iodone 戦略 ルーチンを呼び出すユーザーは、入出力完了ルーチンを指すようにこのフィールドを設定する必要があります。 このルーチンは、入出力の完了時に INTIODONE (未定義) 割り込み レベルで呼び出されます。
b_dev メジャー・デバイス番号とマイナー・デバイス番号。
b_bcount データ転送のバイト・カウント。
b_un.b_addr データ・バッファーのメモリー・アドレス。
b_blkno 装置上のブロック番号。
b_resid エラー後に転送されなかったデータの量。
b_event イベント・リストのアンカー。
b_xmemd クロスメモリー記述子。