Handbuch zur dynamischen Ablaufverfolgung in Solaris

Argumente

Die Argumenttypen für io-Prüfpunkte sind in Tabelle 27–2 aufgeführt. In Tabelle 27–1 finden Sie eine Beschreibung der Argumente.

Tabelle 27–2 Argumente für io-Prüfpunkte

Prüfpunkt 

args[0]

args[1]

args[2]

start

struct buf *

devinfo_t *

fileinfo_t *

done

struct buf *

devinfo_t *

fileinfo_t *

wait-start

struct buf *

devinfo_t *

fileinfo_t *

wait-done

struct buf *

devinfo_t *

fileinfo_t *

Jeder io-Prüfpunkt besitzt Argumente in Form eines Zeigers auf eine buf(9S)-Struktur, eines Zeigers auf eine devinfo_t- und eines Zeigers auf eine fileinfo_t-Struktur. Dieser Abschnitt befasst sich ausführlich mit diesen Strukturen.

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.

devinfo_t

Die Struktur devinfo_t liefert Informationen über Geräte. Auf die Struktur devinfo_t, die dem Zielgerät einer E/A entspricht, wird mit args[1] in den Prüfpunkten start, done, wait-start und wait-done gezeigt. Die Komponenten von devinfo_t lauten:

typedef struct devinfo {
	int dev_major;                  /* major number */
	int dev_minor;                  /* minor number */
	int dev_instance;               /* instance number */
	string dev_name;                /* name of device */
	string dev_statname;            /* name of device + instance/minor */
	string dev_pathname;            /* pathname of device */
} devinfo_t;

Das Feld dev_major stellt die Geräteklasse des Geräts dar. Weitere Informationen finden Sie unter getmajor(9F).

Das Feld dev_minor stellt die Unternummer des Geräts dar. Weitere Informationen finden Sie unter getminor(9F).

Das Feld dev_instance gibt die Instanznummer des Geräts an. Die Instanz eines Geräts ist nicht mit der Unternummer identisch. Die Unternummer ist eine vom Gerätetreiber verwaltete Abstraktion. Bei der Instanznummer handelt es sich um eine Eigenschaft des Geräteknotens. Mit prtconf(1M) können die Instanznummern von Geräteknoten angezeigt werden.

Das Feld dev_name stellt den Namen des Gerätetreibers dar, der das Gerät verwaltet. Mit der Option - Dfür prtconf(1M) lassen sich die Gerätetreibernamen anzeigen.

Das Feld dev_statnamegibt den Namen des Geräts an, wie er von iostat(1M) gemeldet wird. Dieser Name entspricht auch dem Namen einer von kstat(1M) ausgegebenen Kernelstatistik. Das Feld wird bereitgestellt, damit sich abweichende iostat- oder kstat-Ausgaben schnell mit der tatsächlichen E/A-Aktivität in Verbindung bringen lassen.

Das Feld dev_pathname gibt den vollständigen Pfad des Geräts an. Dieser Pfad kann prtconf(1M) als Argument übergeben werden, wenn ausführliche Geräteinformationen gewünscht sind. Die Komponenten des mit dev_pathname angegebenen Pfads geben den Geräteknoten, die Instanznummer und den Unterknoten wieder. Der Statistikname enthält jedoch nicht unbedingt alle drei Elemente. Bei einigen Geräten besteht der Statistikname aus dem Gerätenamen und der Instanznummer, bei anderen aus dem Gerätenamen und der Nummer des Unterknotens. Das bedeutet, dass zwei Geräte mit demselben dev_statname-Wert durchaus einen unterschiedlichen dev_pathname-Wert aufweisen können .

fileinfo_t

Die Struktur fileinfo_t liefert Informationen über Dateien. Auf die Datei, auf die sich eine E/A bezieht, wird mit args[2] in den Prüfpunkten start, done, wait-start und wait-done gezeigt. Ob Dateiinformationen vorliegen, hängt davon ab, ob das Dateisystem diese Informationen beim Dispatchen von E/A-Anforderungen bereitstellt. Einige Dateisysteme, insbesondere von anderen Herstellern, geben diese Informationen möglicherweise nicht an. Außerdem können E/A-Anforderungen aus Dateisystemen stammen, für die keine Dateiinformationen existieren. E/A-Operationen mit Dateisystem-Metadaten werden zum Beispiel mit keiner einzelnen Datei in Verbindung gebracht. Schließlich können einige hoch optimierte Dateisysteme E/A aus separaten Dateien in einer einzigen E/A-Anforderung zusammenfassen. In diesem Fall macht·das Dateisystem Dateiinformationen entweder für die Datei, die die meisten E/A-Operationen oder die Datei, die einige der E/A-Operationen durchführt, verfügbar. Alternativ dazu kann es sein, dass das Dateisystem in diesem Fall überhaupt keine Informationen zur Verfügung stellt.

Die Definition der Struktur fileinfo_t lautet:

typedef struct fileinfo {
	string fi_name;                 /* name (basename of fi_pathname) */
	string fi_dirname;              /* directory (dirname of fi_pathname) */
	string fi_pathname;             /* full pathname */
	offset_t fi_offset;             /* offset within file */
	string fi_fs;                   /* filesystem */
	string fi_mount;                /* mount point of file system */
} fileinfo_t;

Das Feld fi_name enthält den Namen der Datei, aber keine Verzeichniskomponenten. Wenn keine Dateiinformationen mit einer E/A in Verbindung gebracht werden können, wird das Feld fi_name auf die Zeichenkette <none> gesetzt. In seltenen Fällen ist der Pfadname für eine Datei unbekannt. Dann wird das Feld fi_name auf die Zeichenkette <unknown> gesetzt.

Das Feld fi_dirname enthält nur die Verzeichniskomponente des Dateinamens. Ebenso wie bei fi_name kann diese Zeichenkette auf <none> gesetzt sein, wenn keine Dateiinformationen vorliegen, oder auf <unknown>, wenn der Pfadname der Datei unbekannt ist.

Das Feld fi_pathname enthält den vollständigen Pfadnamen der Datei. Ebenso wie bei fi_name kann diese Zeichenkette auf <none> gesetzt sein, wenn keine Dateiinformationen vorliegen, oder auf <unknown>, wenn der Pfadname der Datei unbekannt ist.

Das Feld fi_offset enthält den Versatz innerhalb der Datei oder -1, wenn entweder keine Dateiinformationen vorliegen oder der Versatz auf andere Weise nicht vom Dateisystem angegeben wird.