/usr/share/doc/HOWTO/de-html/DE-SCSI-Programmierung-HOWTO-5.html is in doc-linux-de 2003.10-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.65">
<TITLE>Das Linux SCSI Programmier HOWTO: Überblick der Deviceprogrammierung</TITLE>
<LINK HREF="DE-SCSI-Programmierung-HOWTO-6.html" REL=next>
<LINK HREF="DE-SCSI-Programmierung-HOWTO-4.html" REL=previous>
<LINK HREF="DE-SCSI-Programmierung-HOWTO.html#toc5" REL=contents>
</HEAD>
<BODY>
<A HREF="DE-SCSI-Programmierung-HOWTO-6.html"><IMG SRC="next.png" ALT="Weiter"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO-4.html"><IMG SRC="prev.png" ALT="Zurück"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO.html#toc5"><IMG SRC="toc.png" ALT="Inhalt"></A>
<HR>
<H2><A NAME="s5">5.</A> <A HREF="DE-SCSI-Programmierung-HOWTO.html#toc5">Überblick der Deviceprogrammierung</A></H2>
<P>Das Headerfile <CODE>include/scsi/sg.h</CODE>
enthält die Beschreibung des Interface (dies basiert auf Kernelversion
1.3.98):</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
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 */
};
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>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
<A HREF="DE-SCSI-Programmierung-HOWTO-7.html#sec-header">sec-header</A>
erläutert.</P>
<P>Die allgemeine Prozedur zum Datenaustausch läuft wie folgt:
ein Kommando wird mit <CODE>write()</CODE> an ein geöffnetes Gerät geschickt.
Der Block dazu enthält diese drei Abschnitte:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
struct sg_header
SCSI Kommando
zu schickende Daten zu diesem Kommando
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Das Ergebnis eines Kommandos wird mit <CODE>read()</CODE> gelesen. Der Block hat
eine ähnliche Struktur:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
struct sg_header
gelieferte Daten vom SCSI-Gerät
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Dies war der Überblick der Prozedur. Die folgenden Kapitel beschreiben
die einzelnen Schritte detaillierter.</P>
<P>Hinweis: Bis hin zu aktuellen Kerneln ist es notwendig, das SIGINT signal
zwischen <CODE>write()</CODE> und entsprechendem <CODE>read()</CODE> Aufruf zu blockieren
(z.B. mittels <CODE>sigprocmask()</CODE>). Eine Rückkehr nach der <CODE>write()</CODE>
Hälfte ohne den <CODE>read()</CODE> 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.</P>
<HR>
<A HREF="DE-SCSI-Programmierung-HOWTO-6.html"><IMG SRC="next.png" ALT="Weiter"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO-4.html"><IMG SRC="prev.png" ALT="Zurück"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO.html#toc5"><IMG SRC="toc.png" ALT="Inhalt"></A>
</BODY>
</HTML>
|