Inhalt

5. Überblick der Deviceprogrammierung

Das Headerfile include/scsi/sg.h enthält die Beschreibung des Interface (dies basiert auf Kernelversion 1.3.98):

struct sg_header
 {
  int pack_len;    /* Länge des eingehenden Pakets (mit Header) */
  int reply_len;   /* Maximallänge des erwarteten Antwortpakets */
  int pack_id;     /* Id Nummer des Pakets */
  int result;      /* Ergebnis 0 bedeutet ok, sonst einer der errno Codes */
  unsigned int twelve_byte:1;
               /* Erzwinge 12 byte Kommandolänge für Gruppe 6 & 7 
Kommandos  */
  unsigned int other_flags:31;                  /* für Erweiterungen */
  unsigned char sense_buffer[16]; /* nur bei Antwortpaketen benutzt */
  /* Als nächstes folgen direkt der Block mit dem SCSI-Kommando und 
eventuell Daten zum Befehl */
 };

Diese Struktur legt fest, wie ein SCSI Kommando bearbeitet werden soll und nimmt das Ergebnis nach erfolgter Abarbeitung auf. Die einzelnen Komponenten werden später in Kapitel sec-header erläutert.

Die allgemeine Prozedur zum Datenaustausch läuft wie folgt: ein Kommando wird mit write() an ein geöffnetes Gerät geschickt. Der Block dazu enthält diese drei Abschnitte:

struct sg_header
SCSI Kommando
zu schickende Daten zu diesem Kommando

Das Ergebnis eines Kommandos wird mit read() gelesen. Der Block hat eine ähnliche Struktur:

struct sg_header
gelieferte Daten vom SCSI-Gerät

Dies war der Überblick der Prozedur. Die folgenden Kapitel beschreiben die einzelnen Schritte detaillierter.

Hinweis: Bis hin zu aktuellen Kerneln ist es notwendig, das SIGINT signal zwischen write() und entsprechendem read() Aufruf zu blockieren (z.B. mittels sigprocmask()). Eine Rückkehr nach der write() Hälfte ohne den read() Aufruf führt zur Blockade bei nachfolgenden Zugriffen. Diese Behandlung ist in den Beispielen nicht enthalten. Es sollte daher beim Laufenlassen der Beispiele auf das Signal SIGINT (Drücken von ^C) verzichtet werden.


Inhalt