Solaris 動的トレースガイド

bufinfo_t 構造体

bufinfo_t 構造体は、入出力要求について説明する抽象化オブジェクトです。start プローブ、done プローブ、wait-start プローブ、および wait-done プローブ内の args[0] は、入出力要求のバッファーをポイントしています。以下は、bufinfo_t 構造体の定義です。

typedef struct bufinfo {
	int b_flags;                    /* flags */
	size_t b_bcount;                /* number of bytes */
	caddr_t b_addr;                 /* buffer address */
	uint64_t b_blkno;               /* expanded block # on device */
	uint64_t b_lblkno;              /* block # on device */
	size_t b_resid;                 /* # of bytes not transferred */
	size_t b_bufsize;               /* size of allocated buffer */ 
	caddr_t b_iodone;               /* I/O completion routine */
	dev_t b_edev;                   /* extended device */
 } bufinfo_t;

b_flags メンバーは、複数の状態値のビット単位の論理和であり、入出力バッファーの状態を表します。表 27–3 に、有効な状態値を示します。

表 27–3 b_flags の値

B_DONE

データ転送が完了しました。 

B_ERROR

入出力転送エラーが発生しました。この値は、b_error フィールドとともに設定されます。

B_PAGEIO

バッファーは、呼び出された入出力要求内で使用されています。詳細については、b_addr フィールドの説明を参照してください。

B_PHYS

バッファーは、ユーザーデータ領域への物理 (直接) 入出力で使用されています。 

B_READ

周辺機器から主記憶へデータが読み込まれます。 

B_WRITE

主記憶から周辺機器へデータが転送されます。 

B_ASYNC

非同期入出力要求です。この要求は待機されません。非同期入出力要求が発行されても、wait-start プローブや wait-done プローブは起動しません。ただし、非同期として指定された一部の入出力要求には、B_ASYNC が設定されていないことがあります。 非同期入出力サブシステムは、別のワークスレッドに非同期入出力操作を行わせることによって、非同期要求に応じることがあります。

b_bcount フィールドには、入出力要求の一環として転送されるバイト数が入ります。

B_PAGEIO が設定されていない場合、b_addr フィールドには、入出力要求の仮想アドレスが入ります。B_PHYS が設定されていない場合、これはカーネル仮想アドレスです。B_PHYS が設定されている場合は、ユーザー仮想アドレスです。B_PAGEIO が設定されている場合、b_addr フィールドには、カーネル非公開データが入ります。B_PHYSB_PAGEIO は、どちらか 1 つだけを設定してください。そうしないと、両方とも設定されません。

b_lblkno フィールドは、デバイス上のどの論理ブロックがアクセスされるかを表します。論理ブロックから物理ブロック (シリンダ、トラックなど) へのマッピングは、デバイスごとに定義されています。

b_resid フィールドには、エラーのため転送されなかったバイト数が入ります。

b_bufsize フィールドには、割り当て済みのバッファーのサイズが入ります。

b_iodone フィールドは、入出力の完了時に呼び出されるカーネル内の特定のルーチンを表します。

b_error フィールドには、入出力エラーの際ドライバから返されるエラーコードが入ります。b_error が設定されるときは、b_flags メンバー内にも B_ERROR ビットが設定されます。

b_edev フィールドには、アクセス対象のデバイスのメジャーデバイス番号とマイナーデバイス番号が入ります。コンシューマは、D サブルーチン getmajor()getminor() を使って、b_edev フィールドからメジャーデバイス番号とマイナーデバイス番号を抽出します。