Handbuch zur dynamischen Ablaufverfolgung in Solaris

Die Struktur bufinfo_t

Die Struktur bufinfo_t ist die eine E/A-Anforderung beschreibende Abstraktion. Auf den Puffer für eine E/A-Anforderung wird mit args[0] in den Prüfpunkten start, done, wait-start und wait-done gezeigt. Die Definition der Struktur bufinfo_t lautet:

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;

Die Komponente b_flags gibt den Status des E/A-Puffers an und besteht aus einem Bitwise- oder anderen Statuswerten. Tabelle 27–3 zeigt die gültigen Statuswerte.

Tabelle 27–3 Werte für b_flags

B_DONE

Zeigt an, dass die Datenübertragung abgeschlossen ist. 

B_ERROR

Deutet auf einen E/A-Übertragungsfehler hin. Wird in Verbindung mit dem Feld b_error gesetzt.

B_PAGEIO

Gibt an, dass der Puffer für eine per Paging behandelte E/A-Anforderung verwendet wird. In der Beschreibung des Felds b_addr finden Sie weitere Informationen.

B_PHYS

Gibt an, dass der Puffer für eine physische (direkte) E/A an einen Benutzerdatenbereich verwendet wird. 

B_READ

Gibt an, dass die Daten aus dem Peripheriegerät in den Hauptspeicher eingelesen werden müssen. 

B_WRITE

Gibt an, dass die Daten aus dem Hauptspeicher an das Peripheriegerät übertragen werden müssen. 

B_ASYNC

Die E/A-Anforderung ist asynchron. Auf sie wird nicht gewartet. Die Prüfpunkte wait-start und wait-done werden für asynchrone E/A-Anforderungen nicht ausgelöst. Beachten Sie, dass B_ASYNC bei manchen als asynchron vorgesehenen E/A nicht gesetzt ist: Das Subsystem für asynchrone E/A kann die asynchrone Anforderung unter Umständen durch einen separaten Arbeiter-Thread implementieren, der eine synchrone E/A-Operation durchführt.

Das Feld b_bcount gibt die Anzahl der im Rahmen der E/A-Anforderung zu übertragenden Byte an.

Das Feld b_addr ist die virtuelle Adresse der E/A-Anforderung, sofern B_PAGEIO nicht gesetzt ist. Bei der Adresse handelt es sich um eine virtuelle Kernel-Adresse, sofern B_PHYS nicht gesetzt ist. In diesem Fall handelt es sich um eine virtuelle Benutzer-Adresse. Wenn B_PAGEIO gesetzt ist, enthält das Feld b_addr private Kerneldaten. Es kann entweder genau eines der Flags B_PHYS und B_PAGEIO oder aber keines gesetzt sein.

Das Feld b_lblkno gibt an, auf welchen logischen Block auf dem Gerät zugegriffen werden muss. Die Zuordnung zwischen einem logischen und einem physischen Block (z. B. Zylinder oder Spur) ist durch das Gerät definiert.

Das Feld b_resid ist auf die Anzahl der aufgrund eines Fehlers nicht übertragenen Byte gesetzt.

Das Feld b_bufsize enthält die Größe des zugewiesenen Puffers.

Das Feld b_iodone gibt eine bestimmte Routine im Kernel an, die aufgerufen wird, wenn die E/A abgeschlossen ist.

Das Feld b_error kann einen im Fall eines E/A-Fehlers vom Treiber gelieferten Fehlercode enthalten. b_error wird in Verbindung mit dem B_ERROR-Bit in der Komponente b_flags gesetzt.

Das Feld b_edev enthält die Geräteklasse und Unternummer des Geräts, auf das zugegriffen wird. Die Verbraucher können die Geräteklasse und Unternummer mithilfe der D-Subroutinen getmajor() und getminor() aus dem Feld b_edev extrahieren.