Eingangspunkt des Einheitentreibers 'ddstrategy'

Zweck

Führt blockorientierte Ein-/Ausgabe durch Planen eines Lese-oder Schreibvorgangs für eine Blockeinheit aus.

Syntax

void ddstrategy ( bp)
struct buf *bp;

Parameter

Element Beschreibung
Bp Verweist auf eine Buf -Struktur, die alle für die Datenübertragung erforderlichen Informationen beschreibt.

Beschreibung

Wenn der Kernel eine blockorientierte E/A-Übertragung benötigt, ruft er die Strategieroutine Datendefinitionsstrategie des Einheitentreibers für diese Einheit auf. Die Strategiroutine plant die Ein-/Ausgabe für die Einheit. Dies erfordert normalerweise die folgenden Aktionen:

  • Die Anforderungen müssen der Liste der E/A-Anforderungen hinzugefügt werden, die von der Einheit verarbeitet werden müssen.
  • Wenn die Anforderungsliste vor den vorhergehenden Hinzufügungen leer war, muss die E/A-Startroutine der Einheit aufgerufen werden.

Erforderliche Verarbeitung

Die Routine Datendefinitionsstrategie kann eine einzelne Anforderung mit mehreren Buf -Strukturen empfangen. Es ist jedoch nicht erforderlich, Anforderungen in einer bestimmten Reihenfolge zu verarbeiten.

Der Strategieroutine kann eine Liste der auszuführenden Operationen übergeben werden. Derav_forwFeld im Header Buf beschreibt diese auf null endende Liste von Buf -Headern. Diese Liste ist nicht doppelt verknüpft:av_backFeld ist nicht definiert

Blockeinheitentreiber müssen mehrere Blockübertragungen ausführen können. Wenn die Einheit nicht mehrere Blockübertragungen ausführen kann oder unter bestimmten Bedingungen nur mehrere Blockübertragungen ausführen kann, muss der Einheitentreiber die Daten mit mehreren Einheitenoperationen übertragen.

Kernelpuffer und Verwendung der buf-Struktur

Ein Speicherbereich wird innerhalb des Kernelspeicherbereichs für die Pufferung von Datenübertragungen zwischen einem Programm und dem Peripheriegerät reserviert. Jeder Kernelpuffer hat einen Header, die Struktur Buf , die alle erforderlichen Informationen für die Durchführung der Datenübertragung enthält. Die Routine Datendefinitionsstrategie ist für die Aktualisierung von Feldern in diesem Header als Teil der Übertragung verantwortlich.

Der Aufrufende der Strategieroutine sollte dieb_iodoneFeld, um auf die E/A-Routine des Aufrufenden zu verweisen. Wenn eine E/A-Operation abgeschlossen ist, ruft der Einheitentreiber den Iodon -Kernel-Service auf, der dann die in derb_iodoneFeld. Der Iodon -Kernel-Service führt diesen Aufruf von der Interruptebene INTIODONE aus.

Der Wert desb_flagsFeld wird durch logisches Verknüpfen von null oder mehr möglichenb_flagsFeldmarkierungswerte.

Achtung:
  • Ändern Sie keines der folgenden Felder der Struktur Buf , die an den Eingangspunkt Datendefinitionsstrategie übergeben wird:b_forw,b_back,b_dev,b_unoderb_blknoFeld. Das Ändern dieser Felder kann zu unvorhersehbaren und katastrophalen Ergebnissen führen.
  • Ändern Sie keines der folgenden Felder einer Buf -Struktur, die mit dem Geteblk -Service angefordert wurde:b_flags,b_forw,b_back,b_dev,b_countoderb_unFeld. Das Ändern dieser Felder kann zu unvorhersehbaren und katastrophalen Ergebnissen führen.

Ausführungsumgebung

Die Routine Datendefinitionsstrategie muss für die Ausführung in einer Ausführungsumgebung für Interrupt-Handler (untere Hälfte des Einheitentreibers) codiert werden. Das heißt, die Routine sollte weder Benutzerspeicher, noch Fehlseitenbedingungen oder Ruhemodus berühren.

Rückgabewerte

Die Routine Datendefinitionsstrategie gibt im Gegensatz zu anderen Einheitentreiberroutinen keinen Rückkehrcode zurück. Alle Fehlerinformationen werden in den entsprechenden Feldern in der Buf -Struktur zurückgegeben, auf die der Parameter Bp verweist.

Sofern zutreffend müssen die Rückgabewerte verwendet werden, die im Standard POSIX 1003.1 für die Subroutinen read und write definiert sind.