buf 構造
目的
プログラムと周辺装置との間のデータ転送のバッファリングについて説明します。
カーネル・バッファーの概要
ブロック・デバイスの場合、カーネル・バッファーは、プログラムと周辺装置の間のデータ転送をバッファーに入れるために使用されます。 これらのバッファーは、4096 バイトのブロック単位で割り振られます。 どの時点においても、各メモリー・ブロックは、デバイス・ドライバーとカーネルが維持する以下の 2 つのリンク・リストのいずれかのメンバーです。
| リスト | 説明 |
|---|---|
| 使用可能なバッファー・キュー (avlist) | 使用可能なすべてのバッファーのリスト。 これらのバッファーには、装置との間で転送を待機しているデータは含まれません。 |
| ビジー・バッファー・キュー (blist) | 装置との間で転送を待機しているデータを含むすべてのバッファーのリスト。 |
各バッファーには、それを指す ブフ 構造体と呼ばれるバッファー・ヘッダーが関連付けられています。 各バッファー・ヘッダーにはいくつかの部分があります。
- ブロックに関する情報
- 状況情報を表示するためのフラグ
- ビジー・リストの順方向ポインターと逆方向ポインター
- 使用可能リストの順方向ポインターと逆方向ポインター
デバイス・ドライバーは、av_forwおよびav_backポインター (使用可能ブロックの場合) を保持しながら、カーネルはb_forwおよびb_backポインター (使用中ブロックの場合)。
ブロック入出力の buf 構造変数
/usr/include/sys/buf.h ファイルに定義されている buf 構造体には、以下のフィールドが含まれています。
| 項目 | 説明 |
|---|---|
| b_flags | フラグ・ビット。 このフィールドの値は、以下の値の 1 つ以上を論理 OR することによって構成されます。
|
| 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 | クロスメモリー記述子。 |