ddopen-Einstiegspunkt für Einheitentreiber

Zweck

Bereitet eine Einheit für Lese-, Schreib-oder Steuerfunktionen vor

Syntax

#include <sys/device.h>
  
int ddopen (devno, devflag, chan,  ext)
dev_t  devno;
ulong  devflag;
chan_t  chan;
int ext;

Parameter

Element Beschreibung
Devno Gibt Haupt-und Nebeneinheitennummern an.
Einheitenflag Gibt Flags für die Steuerung offener Dateien an
Chan Gibt die Kanalnummer an
ext Gibt den Erweiterungsparameter an.

Beschreibung

Der Kernel ruft die Routine ddopen eines Einheitentreibers auf, wenn ein Programm einen Öffnen -oder Creat -Subroutinenaufruf ausgibt. Sie kann auch aufgerufen werden, wenn ein Systemaufruf, ein Kernelprozess oder ein anderer Einheitentreiber den Kernel-Service fp_opendev oder fp_öffnen verwendet, um die Einheit zu verwenden.

Die ddopen -Routine muss bei Bedarf zunächst einen exklusiven Zugriff auf die Einheit sicherstellen. Viele Zeicheneinheiten, z. B. Drucker und Plotter, sollten jeweils nur von einem Prozess geöffnet werden. Die ddopen -Routine kann dies erzwingen, indem sie eine statische Flagvariable verwaltet, die auf 1 gesetzt wird, wenn das Gerät geöffnet ist, und auf 0, wenn nicht.

Bei jedem Aufruf der Routine ddopen wird der Wert des Flags überprüft. Wenn der Wert ungleich 0 ist, gibt die Routine ddopen den Rückkehrcode AUSGELASTET zurück, um anzuzeigen, dass die Einheit bereits geöffnet ist. Andernfalls setzt die Routine ddopen das Flag und gibt normal zurück. Der Eingangspunkt ddclose löscht später das Flag, wenn das Gerät geschlossen wird.

Da die meisten Blockeinheiten von mehreren Prozessen gleichzeitig verwendet werden, sollte ein Blocktreiber nicht versuchen, das Öffnen durch einen einzelnen Benutzer zu erzwingen.

Die Routine ddopen muss die Einheit initialisieren, wenn dies die erste Öffnung ist, die aufgetreten ist. Die Initialisierung umfasst die folgenden Schritte:

  1. Die ddopen -Routine sollte der Einheit die erforderlichen Systemressourcen (wie DMA-Kanäle, Interruptebenen und Prioritäten) zuordnen. Falls erforderlich, sollte die Interrupt-Steuerroutine der Einheit für die Interruptebene registriert werden, die zur Unterstützung der Zieleinheit erforderlich ist. (Die Kernel-Services i_init und d_Initialisierung sind zum Initialisieren dieser Ressourcen verfügbar.)
  2. Wenn dieser Einheitentreiber die Hauptrolle für eine Einheit bereitstellt und ein anderer Einheitentreiber die Handlerrolle, sollte die ddopen -Routine den fp_opendev -Kernelservice verwenden, um den Einheitenhandler zu öffnen.
    Anmerkung: Der Kernel-Service fp_opendev erfordert einen Parameter Devno , um anzugeben, welcher Einheitenhandler geöffnet werden soll. Dieser Devno -Wert, der aus der entsprechenden Einheitenabhängigen Struktur (DDS) stammt, sollte in einem speziellen Sicherungsbereich gespeichert worden sein, als die ddconfig -Routine dieses Einheitentreibers aufgerufen wurde.

Für den Parameter 'devflag' definierte Flags

Der Parameter devflag hat die folgenden Flags, wie in der Datei /usr/include/sys/device.h definiert:

Element Beschreibung
DKERNEL Eingangspunkt, der von der Kernelroutine unter Verwendung des Kernel-Service fp_opendev oder fp_öffnen aufgerufen wird.
LESEVORGANG Zum Lesen öffnen.
DWRITE Zum Schreiben öffnen.
HINZUFÜGEN Zum Anhängen öffnen.
DNDELAY@info:nach Einheit im nicht blockierenden Modus geöffnet.

Ausführungsumgebung

Die Routine ddopen 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 ddopen kann eine Fehlerbedingung für das Benutzermodus-Anwendungsprogramm angeben, indem ein Rückkehrcode ungleich null zurückgegeben wird. Die Rückgabe eines Rückgabecodes ungleich Null führt dazu, dass offen oder erstellen Subroutinen, die einen Wert von-1 und stellt den Rückgabecode der Benutzermodusanwendung im Fehler Globale Variable. Der verwendete Rückgabecode sollte einer der Werte sein, die in der/usr/include/errno.h Datei.

Wenn von der Routine ddopen ein Rückkehrcode ungleich null zurückgegeben wird, wird die Öffnungsanforderung als fehlgeschlagen betrachtet. Daher steht dem Aufrufenden kein Zugriff auf die Einheiteninstanz zur Verfügung. Darüber hinaus ruft der Kernel für Nicht-Multiplexer-Treiber, wenn das fehlgeschlagene Öffnen das erste Öffnen der Einheiteninstanz war, den Eingangspunkt ddclose des Treibers auf, damit Ressourcen und der Status des Einheitentreibers bereinigt werden können. Wenn der Treiber multiplexiert wurde, ruft der Kernel den Eingangspunkt ddclose bei einem Fehler beim Öffnen nicht auf.

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