devswadd-Kernel-Service

Zweck

Fügt der Einheitenwechseltabelle einen Einheiteneintrag hinzu.

Syntax

#include <sys/types.h>
#include <sys/errno.h>
#include <sys/device.h>
int devswadd ( devno,  dswptr)
dev_t devno;
struct devsw *dswptr;

Parameter

Element Beschreibung
Devno Gibt die Major-und Minor-Einheitennummern an, die dem angegebenen Eintrag in der Einheitenwechseltabelle zugeordnet werden soll
DSWPTR Verweist auf die Einheitenswitchstruktur, die der Einheitenswitchtabelle hinzugefügt werden soll.

Beschreibung

Der DevSWADD -Kernel-Service wird normalerweise von der ddconfig -Routine eines Einheitentreibers aufgerufen, um die Eingangspunkte des Einheitentreibers in der Einheitenwechseltabelle hinzuzufügen oder zu ersetzen. Die Einheitenswitchtabelle ist eine Tabelle mit Einheitenswitchstrukturen (Devsw), die durch die Haupteinheitennummer des Einheitentreibers indexiert werden. Diese Strukturtabelle wird von den Einheitentreiberschnittstellenservices im Kernel verwendet, um das Aufrufen von Einheitentreiberroutinen zu erleichtern.

Der Teil mit der Haupteinheitennummer des Parameters Devno wird verwendet, um den Index in der Einheitenswitchtabelle anzugeben, in die der DevSWADD -Service den angegebenen Einheitenswitcheintrag stellen muss. Bevor dieser Service die Einheitenswitchstruktur in die Einheitenswitchtabelle kopiert, prüft er den vorhandenen Eintrag, um festzustellen, ob eine geöffnete Einheit sie verwendet. Wenn ein geöffnetes Gerät den auszutauschenden Eintrag belegt, führt der DevSWADD -Service die Aktualisierung nicht aus. Stattdessen wird ein EEXIST (EXIST) -Fehlerwert zurückgegeben. Wenn die Aktualisierung erfolgreich ist, wird der Wert 0 zurückgegeben.

Eingangspunkte in der Einheitenswitchstruktur, die vom Einheitentreiber nicht unterstützt werden, müssen auf eine von zwei Arten behandelt werden. Wenn ein Aufruf an einen nicht unterstützten Eingangspunkt zur Rückgabe eines Fehlercodes führen soll, muss der Eingangspunkt auf die Routine Knotenv in der Struktur gesetzt werden. Daher ruft jeder Aufruf an diesen Eingangspunkt automatisch die Routine Knotenv auf, die einen ENODEW -Fehlercode zurückgibt. Der Kernel stellt die Routine Knotenv bereit.

Andernfalls sollte ein Aufruf an einen nicht unterstützten Eingangspunkt als Funktion ohne Operation behandelt werden. Anschließend sollte der entsprechende Eingangspunkt auf die Routine nulleinheit gesetzt werden. Die nulleinheit -Routine, die ebenfalls vom Kernel bereitgestellt wird, führt keine Operation aus, wenn sie aufgerufen wird, und gibt den Rückkehrcode 0 zurück.

Auf Multiprozessorsystemen werden alle Einheitentreiberroutinen standardmäßig auf dem ersten Prozessor ausgeführt, der beim Booten des Systems gestartet wurde. Dies stellt die Kompatibilität mit Einzelprozessoreinheitentreibern sicher. Wenn der hinzuzufügende Einheitentreiber für die Multiprozessorsicherheit konzipiert wurde, setzen Sie das Flag DEV_MPSAFE in derd_optsFeld der Devsw -Struktur, die an den DevSWADD -Kernelservice übergeben wird. Die Einheitentreiberroutinen werden dann auf jedem verfügbaren Prozessor ausgeführt.

Alle anderen Felder in der Struktur, die nicht verwendet werden, sollten auf 0 gesetzt werden. Einige Felder in der Struktur sind für die Kernelverwendung bestimmt. Der DevSWADD -Service kopiert diese Felder nicht in die Switchtabelle der Einheit. Diese Felder sind in der /usr/include/device.h -Datei dokumentiert.

Ausführungsumgebung

Der Kernel-Service DevSWADD kann nur über Prozessumgebung aufgerufen werden.

Rückgabewerte

Element Beschreibung
0 Zeigt eine erfolgreiche Operation an.
EEXIST Gibt an, dass der angegebene Einheitenswitcheintrag im Gebrauch ist und nicht ausgetauscht werden kann.
ENOMEM Gibt an, dass der Eintrag aufgrund von nicht ausreichendem Realspeicher nicht fixiert werden kann.
EINVAL Gibt an, dass der Teil mit der Haupteinheitennummer des Parameters Devno die maximal zulässige Anzahl von Einheitenswitcheinträgen überschreitet.