Eingangspunkt des Einheitentreibers 'ddread'

Zweck

Liest Daten von einer Zeicheneinheit ein.

Syntax

#include <sys/device.h>
#include <sys/types.h>

int ddread ( devno,  uiop,  chan,  ext)
dev_t devno;
struct uio *uiop;
chan_t chan;
int ext;

Parameter

Element Beschreibung
Devno Gibt die Haupt-und Nebeneinheitennummern an.
Uiop Verweist auf eine UIO -Struktur, die den Datenbereich oder die Datenbereiche beschreibt, in denen geschrieben werden soll.
Chan Gibt die Kanalnummer an
ext Gibt den Erweiterungsparameter an.

Beschreibung

Wenn ein Programm einen Lesen -oder Readx -Subroutinenaufruf ausgibt oder der Fp_rwuio -Kernel-Service verwendet wird, ruft der Kernel den Eingangspunkt Ddread auf.

Dieser Eingangspunkt empfängt einen Zeiger auf eine UIO -Struktur, die Variablen zur Angabe der Datenübertragungsoperation bereitstellt.

Zeicheneinheitentreiber können die Kernel-Services Ureadc und Uiomove verwenden, um Daten in den und aus dem Benutzerpufferbereich während eines Lesen -Subroutinenaufrufs zu übertragen. Diese Services empfangen einen Zeiger auf die Struktur UIO und aktualisieren die Felder in der Struktur um die Anzahl der übertragenen Byte. Die einzigen Felder in der UIO -Struktur, die von der Datenübertragung nicht geändert werden können, sind dieuio_fmodeunduio_segflgFelder.

Bei den meisten Einheiten sendet die Routine Ddread die Anforderung an den Einheitenhandler und wartet dann, bis sie beendet ist. Die Wartezeit kann durch Aufrufen des _Ruhemodus -Kernel-Service erreicht werden. Dieser Service setzt den Treiber und den Prozess, der ihn aufgerufen hat, aus und lässt die Ausführung anderer Prozesse zu, bis ein bestimmtes Ereignis eintritt.

Wenn die E/A-Operation abgeschlossen ist, gibt die Einheit in der Regel einen Interrupt aus, wodurch die Interrupt-Steuerroutine des Einheitentreibers aufgerufen wird. Der Interrupt-Handler ruft dann den Kernel-Service E_Wakeup auf, der das erwartete Ereignis angibt, sodass die Routine Ddread fortgesetzt werden kann.

Deruio_residDas Feld enthält anfänglich die Gesamtzahl der Byte, die von der Einheit gelesen wurden. Wenn dies vom Einheitentreiber unterstützt wird,uio_offsetgibt die relative Byteadresse auf der Einheit an, ab der der Lesevorgang beginnen soll.

Deruio_offsetFeld ist eine 64-Bit-Ganzzahl (offset_t); ermöglicht dem Dateisystem, E/A-Anforderungen an die Lese-und Schreibeingangspunkte eines Einheitentreibers zu senden, die logische Offsets mit mehr als 2 Gigabyte aufweisen. Einheitentreiber müssen darauf achten, dass sie keinen Signifikanzverlust verursachen, indem sie den Offset einer 32-Bit-Variablen zuordnen oder ihn in Berechnungen verwenden, die eine 32-Bit-Variable überlaufen.

Wenn kein Fehler auftritt,uio_residFeld sollte bei Rückgabe von der Ddread -Routine 0 sein, um anzuzeigen, dass alle angeforderten Byte gelesen wurden. Wenn ein Fehler auftritt, sollte dieses Feld die Anzahl der Bytes enthalten, die beim Auftreten des Fehlers noch gelesen werden müssen.

Wenn eine Leseanforderung bei einem gültigen Einheitenoffset beginnt, aber über das Ende der Funktionalität der Einheit hinausgeht, sollte kein Fehler zurückgegeben werden. Dieuio_residsollte die Anzahl der nicht übertragenen Byte angeben. Wenn der Lesevorgang am Ende der Funktionalität des Geräts beginnt, sollte kein Fehler zurückgegeben werden. Dieuio_residFeld sollte nicht geändert werden, was bedeutet, dass keine Bytes übertragen wurden. Wenn der Lesevorgang nach dem Ende der Funktionalität der Einheit beginnt, sollte ein ENXIO -Rückkehrcode zurückgegeben werden, ohne dass dieuio_residFeld.

Wenn der Eingangspunkt Ddread für unformatierte Ein-/Ausgabe für eine Blockeinheit bereitgestellt wird, setzt diese Routine Anforderungen normalerweise in blockorientierte Ein-/Ausgabeanforderungen um, die den Uphysio -Kernel-Service verwenden.

Ausführungsumgebung

Die Routine Ddread wird nur in der Prozessumgebung ausgeführt. Er sollte die erforderliche Serialisierung seiner Datenstrukturen bereitstellen, indem er die Sperrenkernel-Services in Verbindung mit einem im Treiber definierten privaten Sperrwort verwendet.

Rückgabewerte

Der Eingangspunkt Ddread kann dem Aufrufenden eine Fehlerbedingung anzeigen, indem er einen Rückkehrcode ungleich null zurückgibt. Dies bewirkt, dass der Aufruf der Subroutine einen Wert von zurückgibt-1 . Außerdem wird der Rückkehrcode dem Benutzermodusprogramm in der globalen Variablen Fehlernummer zur Verfügung gestellt. Der verwendete Fehlercode sollte einer der Werte sein, die in der/usr/include/sys/errno.h Datei.

Gegebenenfalls sollten die Rückgabewerte verwendet werden, die im Standard POSIX 1003.1 für die Subroutine read definiert sind.