uio-Struktur

Zweck

Beschreibt einen Speicherpuffer, der bei einer Datenübertragung verwendet wird

Einführung

Die Benutzer-E/A-oder UIO -Struktur ist eine Datenstruktur, die einen Speicherpuffer beschreibt, der bei einer Datenübertragung verwendet werden soll. Die Struktur UIO wird am häufigsten in den Lese-und Schreibschnittstellen zu Einheitentreibern verwendet, die Zeichen oder unformatierte Ein-/Ausgabe unterstützen. Es ist auch in anderen Fällen nützlich, in denen ein Eingabe-oder Ausgabepuffer in verschiedenen Arten von Adressräumen vorhanden sein kann und in denen der Puffer im virtuellen Speicher nicht zusammenhängend ist.

Die uio -Struktur ist in der Datei /usr/include/sys/uio.h definiert.

Beschreibung

Die Struktur UIO beschreibt einen Puffer, der im virtuellen Speicher nicht zusammenhängend ist. Sie gibt auch den Adressraum an, in dem der Puffer definiert ist. Bei Verwendung in der Zeicheneinheit Lese-und Schreibschnittstelle enthält sie auch die Flags für den Öffnungsmodus der Einheit sowie den Lese-/Schreiboffset der Einheit.

Der Kernel stellt Services bereit, die über eine UIO -Struktur auf Daten zugreifen. Die Kernel-Services Ureadc, uwritec (Befehl), Uiomoveund Uphysio führen alle Datenübertragungen in oder aus einem Datenpuffer durch, der durch eine UIO -Struktur beschrieben wird. Der Ureadc -Kernel-Service schreibt ein Zeichen in den Puffer, der in der Struktur UIO beschrieben wird. Der uwritec (Befehl) -Kernel-Service liest ein Zeichen aus dem Puffer. Diese beiden Services haben Namen, die Ihren Erwartungen entsprechen, da sie nach der Benutzeraktion benannt sind, die die Operation initialisiert. Ein Lesen des Benutzers führt also dazu, dass ein Gerätetreiber in den Puffer schreibt, während ein Schreiben zu einem Treiberlesen aus dem Puffer führt.

Der Uiomove -Kernel-Service kopiert Daten in oder aus einem Puffer, der von einer UIO -Struktur beschrieben wird, aus oder in einen Puffer im Systemadressraum. Der Kernel-Service Uphysio wird hauptsächlich von Blockeinheitentreibern verwendet, die Unterstützung für unformatierte Ein-/Ausgabe bereitstellen. Der Uphysio -Kernel-Service konvertiert die Zeichenlese-oder Schreibanforderung in eine Blocklese-oder Schreibanforderung und sendet sie an die Datendefinitionsstrategie -Routine.

Der von der Struktur UIO beschriebene Puffer kann aus mehreren nicht zusammenhängenden Bereichen des virtuellen Speichers unterschiedlicher Länge bestehen. Dies wird erreicht, indem der Datenpuffer mit einem Array von Elementen beschrieben wird, die jeweils aus einer virtuellen Speicheradresse und einer Bytelänge bestehen. Jedes Element ist alsiovecElement. Die Struktur UIO enthält außerdem ein Feld, das die Gesamtzahl der Byte im Datenpuffer angibt, die von der Struktur beschrieben werden.

Ein weiteres Feld in der Struktur UIO beschreibt den Adressraum des Datenpuffers, bei dem es sich entweder um Systemspeicherbereich, Benutzerspeicherbereich oder speicherübergreifenden Speicherbereich handeln kann. Wenn der Adressraum als speicherübergreifend definiert ist, wird ein zusätzliches Array von speicherübergreifenden Deskriptoren in der UIO -Struktur angegeben, um dem Array voniovecElemente.

Die Struktur UIO enthält auch einen Byte-Offset (uio_offset). Dieses Feld ist eine 64-Bit-Ganzzahl (offset_t); ermöglicht es dem Dateisystem, E/A-Anforderungen an die Lese-und Schreibeingangspunkte eines Einheitentreibers zu senden, die logische Offsets mit mehr als 2 Gigabyte haben. 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.

Die aufgerufene Routine (Einheitentreiber) ist berechtigt, Felder in den Strukturen UIO und Iovec zu ändern, wenn die Datenübertragung fortschreitet. Das Finaleuio_residcount wird tatsächlich verwendet, um zu bestimmen, wie viele Daten übertragen wurden. Daher muss dieser Zähler bei jeder Operation um die Anzahl der tatsächlich kopierten Byte verringert werden.

Die Struktur UIO enthält die folgenden Felder:

Feld Beschreibung
uio_iov Ein Zeiger auf ein Array von Iovec -Strukturen, die den Benutzerpuffer für die Datenübertragung beschreiben.
uio_xmem Ein Zeiger auf ein Array von Xmem -Strukturen, die die speicherübergreifenden Deskriptoren für das Array Iovec enthalten.
uio_iovcnt Die Anzahl der noch zu verarbeitenden Iovec -Strukturen in dem Array, auf das dieuio_iovZeiger. Die Anzahl muss mindestens 1 sein. Wenn die Anzahl größer als 1 ist, muss eine Streudiagramm der Daten in die oder aus den von den Iovec -Strukturen beschriebenen Bereichen ausgeführt werden.
uio_iovdcnt Die Anzahl der bereits verarbeiteten Iovec -Strukturen im Array Iovec .
uio_offset Der Dateioffset, der durch einen vorherigen Aufruf der Subroutine Lseek, Llseek eingerichtet wurde. Die meisten Zeicheneinheiten ignorieren diese Variable, aber einige, z. B. die Pseudoeinheit /dev/mem , verwenden und verwalten sie.
uio_segflg Ein Flag, das den Typ des von der UIO -Struktur beschriebenen Puffers angibt. Dieses Flag beschreibt normalerweise, ob sich der Datenbereich im Benutzer-oder Kernelbereich oder im speicherübergreifenden Bereich befindet. Die Datei /usr/include/sys/uio.h enthält eine Beschreibung der möglichen Werte dieses Flags und ihre Bedeutung.
uio_fmode Der Wert des Dateimodus, der beim Öffnen der Datei angegeben oder von der Subroutine Fcntl geändert wurde Dieses Flag beschreibt die Dateisteuerparameter. Die Datei /usr/include/sys/fcntl.h enthält bestimmte Werte für dieses Flag.
uio_resid Die Bytezahl für die Datenübertragung. Sie darf die Summe alleriov_lenWerte im Array von Iovec -Strukturen. Anfänglich enthält dieses Feld die Gesamtzahl der Byte. Wenn die Operation abgeschlossen ist, muss der Wert um die tatsächliche Anzahl der übertragenen Byte verringert werden.

Die Struktur Iovec enthält die Anfangsadresse und die Länge eines zusammenhängenden Datenbereichs, der in einer Datenübertragung verwendet werden soll. Die Struktur Iovec ist der Elementtyp in einem Array, auf den dieuio_iovFeld in der Struktur UIO . Dieses Array kann eine beliebige Anzahl von Iovec -Strukturen enthalten, von denen jede eine einzelne Einheit zusammenhängenden Speichers beschreibt. Zusammen stellen diese Einheiten die Gesamtfläche dar, in die bzw. von der Daten übertragen werden. Deruio_iovcntFeld gibt die Anzahl der Iovec -Strukturen im Array an.

Die Struktur Iovec enthält die folgenden Felder:

Feld Beschreibung
iov_base Eine Variable in der Iovec -Struktur, die die Basisadresse des zusammenhängenden Datenbereichs in dem Adressraum enthält, der durch dieuio_segflagFeld. Die Länge des zusammenhängenden Datenbereichs wird durch dieiov_lenFeld.
iov_len Eine Variable in der Iovec -Struktur, die die Bytelänge des Datenbereichs ab der in der Variablen iov_basis angegebenen Adresse enthält.