Eingangspunkt des Einheitentreibers 'ddwrite'

Zweck

Schreibt Daten auf eine Zeicheneinheit.

Syntax

#include <sys/device.h>
#include <sys/types.h>
int ddwrite (devno, uiop, chan, ext)
dev_t  devno;
struct uio * uiop;
chan_t  chan;
int  ext;

Parameter

Element Beschreibung
Devno Gibt die Major-und Minor-Einheitennummernan.
Uiop Verweist auf eine UIO -Struktur, die den Datenbereich oder die Bereiche beschreibt, aus denen geschrieben werden soll.
Chan Gibt die Kanalnummeran.
ext Gibt Erweiterungsparameteran.

Beschreibung

Wenn ein Programm einen Schreiben oder Schreibmodus -Subroutinenaufruf ausgibt oder der Fp_rwuio -Kernel-Service verwendet wird, ruft der Kernel den Eingangspunkt DDWRITE auf.

Dieser Eingangspunkt empfängt einen Zeiger auf eine UIO -Struktur, die Variablen bereitstellt, mit denen die Datenübertragungsoperation angegeben wird.

Zeicheneinheitentreiber können die Kernel-Services uwritec (Befehl) und Uiomove verwenden, um Daten in den und aus dem Benutzerpufferbereich während eines Schreiben -Subroutinenaufrufs zu übertragen. Diesen Services wird ein Zeiger auf die Struktur UIO übergeben. Sie aktualisieren die Felder in der Struktur um die Anzahl der übertragenen Byte. Die einzigen Felder in der Struktur UIO , die nicht potenziell durch die Datenübertragung geändert werden, sind dieuio_fmodeunduio_segflgFelder.

Bei den meisten Einheiten stellt die Routine DDWRITE die Anforderung in die Warteschlange des Einheitenhandlers und wartet dann, bis sie beendet ist. Das Warten wird normalerweise dadurch erreicht, dass der _Ruhemodus -Kernel-Service aufgerufen wird, um auf ein Ereignis zu warten. Der _Ruhemodus -Kernel-Service setzt den Treiber und den Prozess, der ihn aufgerufen hat, aus und lässt die Ausführung anderer Prozesse zu.

Wenn die E/A-Operation abgeschlossen ist, verursacht die Einheit normalerweise eine Unterbrechung, 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 DDWRITE fortgesetzt werden kann.

Deruio_residenthält zunächst die Gesamtzahl der Byte, die auf die Einheit geschrieben werden sollen. Wenn dies vom Einheitentreiber unterstützt wird,uio_offsetgibt die relative Byteadresse auf der Einheit an, ab der der Schreibvorgang 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 der Rückgabe von der Routine DDWRITE 0 sein, um anzuzeigen, dass alle angeforderten Byte geschrieben wurden. Wenn ein Fehler auftritt, sollte dieses Feld die Anzahl der Bytes enthalten, die beim Auftreten des Fehlers noch geschrieben werden müssen.

Wenn eine Schreibanforderung 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 Schreibvorgang am oder nach dem Ende der Funktionalität des Geräts beginnt, sollten keine Daten übertragen werden. Der Fehlercode ENXIO sollte zurückgegeben werden, und dieuio_residFeld sollte nicht geändert werden.

Wenn der Eingangspunkt DDWRITE für unformatierte Ein-/Ausgabe für eine Blockeinheit bereitgestellt wird, verwendet diese Routine normalerweise den Uphysio -Kernelservice, um Anforderungen in blockorientierte Ein-/Ausgabeanforderungen umzusetzen.

Ausführungsumgebung

Die Routine DDWRITE wird nur in Prozessumgebungausgefü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 DDWRITE kann dem Aufrufenden eine Fehlerbedingung anzeigen, indem er einen Rückgabewert ungleich null zurückgibt. Dies bewirkt, dass die Subroutine einen Wert zurückgibt von-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 write definiert sind.

Zugehörige Informationen

Der Eingangspunkt des Ddread -Einheitentreibers.

Kernel-Service _Ruhemodus , Kernel-Service E_Wakeup , Kernel-Service Fp_rwuio , Kernel-Service Uiomove , Kernel-Service Uphysio , Kernel-Service uwritec (Befehl) .

Die Struktur UIO .

Die Schreiben und Schreibmodus -Subroutinen

Kernelerweiterung für Einheitentreiber-Übersicht, Informationen Zu Einheitentreiberrollen, Informationen zu Interrupts, Informationen zum Sperren in Programmierkonzepte für Kernelerweiterungen und Einheitenunterstützung.