Konfigurationsmethode schreiben
In diesem Artikel wird beschrieben, wie eine Konfigurationsmethode funktioniert. Außerdem werden Richtlinien für Programmierer vorgeschlagen, die ihre eigenen Konfigurationsmethoden für die Konfiguration von Einheiten schreiben.
Syntax
Beschreibung
Die Konfigurationsmethode verschiebt eine Einheit von Definiert (nicht für die Verwendung im System verfügbar) nach Verfügbar (für die Verwendung im System verfügbar). Wenn die Einheit einen Treiber hat, lädt die Konfigurationsmethode den Einheitentreiber in den Kernel und beschreibt die Einheitenmerkmale für den Treiber. Bei einer Zwischeneinheit (z. B. einem SCSI-Busadapter) bestimmt diese Methode, welche angeschlossenen untergeordneten Einheiten konfiguriert werden sollen, und schreibt ihre logischen Namen in die Standardausgabe.
Die Konfigurationsmethode wird entweder vom Konfigurationsbefehl mkdev oder vom Konfigurationsmanager aufgerufen. Da der Konfigurationsmanager beim Systemboot der Phase 2 ein zweites Mal ausgeführt wird und zur Laufzeit auch wiederholt aufgerufen werden kann, kann die Konfigurationsmethode einer Einheit aufgerufen werden, um eine verfügbare Einheit zu konfigurieren. Dies ist kein Fehler. Bei einem Zwischengerät prüft die Konfigurationsmethode, ob untergeordnete Geräte vorhanden sind. Wenn es sich bei dem Gerät nicht um ein Zwischengerät handelt, kehrt das Verfahren einfach zurück.
Im Allgemeinen ruft die Konfigurationsmethode alle erforderlichen Informationen zur Einheit aus der Konfigurationsdatenbank ab. Die Optionen, die die Phase des Systemboots angeben, werden verwendet, um bestimmte Funktionen auf bestimmte Phasen zu beschränken.
Wenn die Einheit über eine übergeordnete Einheit verfügt, muss die übergeordnete Einheit zuerst konfiguriert werden. Die Konfigurationsmethode für eine Einheit schlägt fehl, wenn sich das übergeordnete Element nicht im Status 'Verfügbar' befindet.
Gemäß Konvention sind die ersten drei Zeichen des Namens der Konfigurationsmethode Konfiguration. Der Rest des Namens (Entwicklung) kann alle Zeichen sein, die den Einschränkungen des Dateinamens des Betriebssystems unterliegen und die Einheit oder Gruppe von Einheiten angeben, die die Methode verwenden.
Flags
| Element | Beschreibung |
|---|---|
| -l Name | Gibt den logischen Namen der zu konfigurierenden Einheit an |
| -1 | Gibt an, dass die Einheit in Phase 1 der Systembootverarbeitung konfiguriert wird. Diese Option kann nicht angegeben werden mit dem-2 Flagge. Wenn weder die-1 noch die-2 Flags angegeben sind, wird die Configure-Methode zur Laufzeit aufgerufen. |
| -2 | Gibt an, dass die Einheit in Phase 2 des Systemboots konfiguriert wird. Diese Option kann nicht angegeben werden mit dem-1 Flagge. Wenn weder die-1 noch die-2 Flags angegeben sind, wird die Configure-Methode zur Laufzeit aufgerufen. |
Handhabung elementarer Produktdaten (VPD) der Einheit
Einheiten, die elementare Produktdaten (VPD, Vital Product Data) bereitstellen, werden in der Objektklasse "Predefined Device" (PdDv) identifiziert, indem der Deskriptor für das Flag "VPD" in jedem PdDv -Objekt der Einheit auf TRUE gesetzt wird. Die Konfigurationsmethode muss die elementaren Produktdaten von der Einheit abrufen und in der Objektklasse für angepasste elementare Produktdaten (CuVPD) speichern. Informationen zum Abrufen der elementaren Produktdaten der Einheit finden Sie in der entsprechenden Hardwaredokumentation. In vielen Fällen werden elementare Produktdaten aus dem Einheitentreiber mithilfe der Subroutine sysconfig abgerufen.
Sobald die elementaren Produktdaten von der Einheit abgerufen wurden, fragt die Konfigurationsmethode die Objektklasse CuVPD ab, um festzustellen, ob in der Einheit Hardwareelementare Produktdaten gespeichert sind. Ist dies der Fall, vergleicht die Methode die von der Einheit abgerufenen elementaren Produktdaten mit denen aus der Objektklasse CuVPD . Wenn die elementaren Produktdaten in beiden Fällen identisch sind, ist keine weitere Verarbeitung erforderlich. Wenn sie sich unterscheiden, aktualisieren Sie die elementaren Produktdaten in der Objektklasse CuVPD für die Einheit. Wenn die Objektklasse CuVPD für die Einheit keine elementaren Produktdaten enthält, fügen Sie die elementaren Produktdaten der Einheit hinzu.
Durch den ersten Vergleich der elementaren Produktdaten der Einheit mit denen in der Objektklasse CuVPD werden Änderungen an der Objektklasse CuVPD reduziert. Dies liegt daran, dass sich die elementaren Produktdaten von einer Einheit normalerweise nicht ändern. Die Reduzierung der Anzahl der Datenbankschreibvorgänge erhöht die Leistung und minimiert mögliche Datenverluste.
Informationen zu Konfigurationsmethodenfehlern
Bei vielen der festgestellten Fehler wird die Konfigurationsmethode mit dem entsprechenden Exit-Code beendet. In anderen Fällen muss die Konfigurationsmethode möglicherweise einige der ausgeführten Operationen rückgängig machen. Beispielsweise kann die Konfigurationsmethode nach dem Laden des Einheitentreibers und dem Definieren der Einheit für den Treiber beim Herunterladen von Mikrocode einen Fehler feststellen. In diesem Fall beendet die Methode die Einheit mit der Subroutine sysconfig vom Treiber und entladen den Treiber mit der Subroutine Laadext .
Die Konfigurationsmethode löscht die Gerätedateien nicht und hebt die Zuordnung der Haupt-und Nebennummern nicht auf, wenn sie erfolgreich zugeordnet wurden und die Gerätedatei erstellt wurde, bevor der Fehler aufgetreten ist. Dies liegt daran, dass das Konfigurationsschema des Betriebssystems die Verwaltung von Haupt-und Nebennummern und Gerätedateien für eine Einheit ermöglicht, auch wenn die Einheit nicht konfiguriert ist.
Wenn die Einheit erneut konfiguriert wird, erkennt die Konfigurationsmethode, dass die Haupt-und Nebennummern zugeordnet sind und die Gerätedateien vorhanden sind.
Wenn die Konfigurationsmethode nach untergeordneten Einheiten sucht, wurde die Einheit erfolgreich konfiguriert. Fehler, die bei der Überprüfung auf untergeordnete Einheiten auftreten können, sind mit dem Exit-Code E_FINDCHILD gekennzeichnet. Der Befehl mkdev erkennt, ob die Konfigurationsmethode erfolgreich abgeschlossen wurde. Bei Bedarf wird eine Nachricht angezeigt, die angibt, dass bei der Suche nach untergeordneten Einheiten ein Fehler aufgetreten ist.
Richtlinien für das Schreiben einer Konfigurationsmethode
Die folgenden Tasks sind Richtlinien für das Schreiben einer Konfigurationsmethode. Beim Schreiben für eine bestimmte Einheit können einige Tasks weggelassen werden. Wenn das Gerät beispielsweise kein Zwischengerät ist oder keinen Treiber hat, wird das Verfahren entsprechend geschrieben. Eine Einheit kann auch besondere Anforderungen haben, die in diesen Tasks nicht aufgeführt sind.
Die Konfigurationsmethode muss:
- Überprüfen Sie die Eingabeparameter. Das Flag -l für den logischen Namen muss angegeben werden, um die zu konfigurierende Einheit anzugeben. Die Flags -1 und -2 können nicht gleichzeitig angegeben werden.
- Initialisieren Sie Object Data Manager (ODM). Verwenden Sie die Subroutine odm_initialize und sperren Sie die Konfigurationsdatenbank mit der Subroutine ODR-Sperre . Ein Beispiel finden Sie unter "Definitionsmethode schreiben".
- Rufen Sie das angepasste Einheitenobjekt (CuDv) für die zu konfigurierende Einheit ab. Der Einheitennamensdeskriptor des CuDv -Objekts muss mit dem mit dem Flag -l angegebenen Namen übereinstimmen. Wird kein Objekt mit dem angegebenen Namen gefunden, wird die Methode mit einem Fehler beendet.
- Rufen Sie das vordefinierte Einheitenobjekt (PdDv) für die zu konfigurierende Einheit ab. Der eindeutige Typdeskriptor des PdDv -Objekts muss mit dem Link zum Objektklassendeskriptor PdDv des CuDv -Objekts des Geräts übereinstimmen.
- Fordern Sie den LED-Wertdeskriptor des PdDv -Objekts der Einheit an. Rufen Sie den Anzeigenwertdeskriptor des PdDv -Objekts der Einheit ab und zeigen Sie diesen Wert mit der Subroutine setleds an den Systemanzeigen an, wenn das Flag -1 oder -2 angegeben ist. Gibt an, wann die Konfigurationsmethode zur Bootzeit ausgeführt wird. Wenn das System während der Konfiguration beim Booten blockiert, gibt der angezeigte LED-Wert an, welche Konfigurationsmethode das Problem verursacht hat.
Wenn die Einheit bereits konfiguriert ist (d. h., der Einheitenstatusdeskriptor des CuDv -Objekts der Einheit gibt den Status 'Verfügbar' an) und eine Zwischeneinheit ist, fahren Sie mit der Task zum Erkennen von untergeordneten Einheiten fort. Ist die Einheit konfiguriert, aber keine Zwischeneinheit, wird die Konfigurationsmethode ohne Fehler beendet.
Wenn sich die Einheit im Status "Definiert" befindet, muss die Konfigurationsmethode die übergeordnete Einheit überprüfen, das Vorhandensein einer Einheit überprüfen, die elementaren Produktdaten der Einheit abrufen und das CuDv -Objekt der Einheit aktualisieren.
- Wenn die Einheit über ein übergeordnetes Element verfügt, validiert die Konfigurationsmethode das Vorhandensein des übergeordneten Elements und prüft, ob sich das übergeordnete Element im Status 'Verfügbar' befindet. Die Methode prüft den Deskriptor für den logischen Namen der übergeordneten Einheit des CuDv -Objekts der Einheit, um den übergeordneten Namen abzurufen. Wenn die Einheit kein übergeordnetes Element hat, ist der Deskriptor eine Nullzeichenfolge.
Wenn die Einheit über ein übergeordnetes Element verfügt, ruft die Konfigurationsmethode das CuDv -Objekt der übergeordneten Einheit ab und überprüft den Einheitenstatusdeskriptor. Wenn das Objekt nicht vorhanden ist oder sich nicht im Status Verfügbar befindet, wird die Methode mit einem Fehler beendet.
Es muss erneut geprüft werden, ob eine übergeordnete Einheit vorhanden ist. Die Konfigurationsmethode muss sicherstellen, dass keine andere Einheit konfiguriert wurde, die mit demselben übergeordneten Element (an derselben Verbindungsposition) verbunden ist. Beispielsweise können zwei Drucker über einen Switch-Box an denselben Port angeschlossen werden. Während jeder Drucker über dieselbe Eltern-und Verbindung verfügt, kann immer nur jeweils ein Drucker konfiguriert werden.
Die Methode Configure führt diese Prüfung durch, indem sie die Objektklasse CuDv abfragt. Er fragt Objekte ab, deren Einheitenstatusdeskriptor auf den Status "Verfügbar" gesetzt ist und deren logischer Name und Standort der übergeordneten Einheit in den Deskriptoren der übergeordneten Einheit mit denen für die zu konfigurierende Einheit übereinstimmen. Wird eine Übereinstimmung gefunden, wird die Methode mit einem Fehler beendet.
- Überprüfen Sie das Vorhandensein der Einheit. Wenn es sich bei der Einheit um eine Adapterkarte handelt und die Konfigurationsmethode zur Laufzeit aufgerufen wurde (dies wird durch das Fehlen der Flags -1 und -2 angezeigt), muss die Konfigurationsmethode das Vorhandensein der Adapterkarte überprüfen. Dies erfolgt durch Lesen von POS-Registern von der Karte. (Die POS-Register werden durch Öffnen und Zugreifen auf die Gerätedatei /dev/bus0 oder /dev/bus1 abgerufen.) Dies ist wichtig, denn wenn die Karte vorhanden ist, muss die Konfigurationsmethode die Bibliotheksroutine Busauflösung aufrufen, um Busressourcen zuzuordnen, um Konflikte mit anderen Adapterkarten im System zu vermeiden. Wenn die Karte nicht vorhanden ist oder die Routine Busauflösung Busressourcen nicht auflösen kann, wird die Methode mit einem Fehler beendet.
- Stellen Sie fest, ob die Einheit über einen Einheitentreiber verfügt. Die Konfigurationsmethode ruft den Namen des Einheitentreibers aus dem Deskriptor für den Namen des Einheitentreibers des PdDv -Objekts der Einheit ab. Wenn dieser Deskriptor eine Nullzeichenfolge ist, hat die Einheit keinen Einheitentreiber.
Wenn die Einheit einen Einheitentreiber hat, muss die Konfigurationsmethode Folgendes ausführen:
- Laden Sie den Einheitentreiber mit der Subroutine Laadext .
- Ermitteln Sie die Haupteinheitennummer mithilfe der Subroutine Genmajor .
- Ermitteln Sie die Nebeneinheitennummer mithilfe der Subroutine GetMinor oder Genminor oder durch Ihre eigene einheitenabhängige Routine.
- Erstellen Sie Gerätedateien im Verzeichnis /dev , wenn sie noch nicht vorhanden sind. Gerätedateien werden mit der Subroutine MKnod erstellt.
- Erstellen Sie die einheitenabhängige Struktur (DDS). Diese Struktur enthält Informationen, die die Merkmale der Einheit für den Einheitentreiber beschreiben. Die Informationen werden normalerweise, aber nicht notwendigerweise, aus den Attributen der Einheit in der Konfigurationsdatenbank abgerufen. Lesen Sie die entsprechenden Einheitentreiberinformationen, um festzustellen, wie die DDS vom Einheitentreiber erwartet werden. Das Thema "Device Dependent Structure (DDS)-Übersicht" beschreibt die DDS-Struktur.
- Verwenden Sie die Subroutine sysconfig , um die DDS an den Einheitentreiber zu übergeben.
- Wenn Code auf das Gerät heruntergeladen werden muss, lesen Sie die erforderliche Datei und übergeben Sie den Code über die vom Einheitentreiber bereitgestellte Schnittstelle an das Gerät. Die Datei, die heruntergeladen werden soll, kann durch ein vordefiniertes Attribut (PdAt) oder ein angepasstes Attribut (CuAt) angegeben werden. Gemäß Konvention befinden sich Mikrocodedateien im Verzeichnis /etc/microcode (dies ist eine symbolische Verbindung zum Verzeichnis /usr/lib/microcode ). Die heruntergeladene Adaptersoftware befindet sich im Verzeichnis /usr/lib/asw .
- Rufen Sie die elementaren Produktdaten der Einheit ab. Nachdem die Tasks, die sich auf den Einheitentreiber beziehen, abgeschlossen sind oder wenn die Einheit keinen Einheitentreiber hatte, stellt die Konfigurationsmethode fest, ob sie elementare Produktdaten von der Einheit abrufen muss. Der VPD-Flag-Deskriptor des PdDv -Objekts der Einheit gibt an, ob es VPD enthält oder nicht.
- Aktualisieren Sie das Objekt CuDv . An diesem Punkt wird die Einheit konfiguriert, wenn keine Fehler festgestellt wurden. Die Konfigurationsmethode aktualisiert den Einheitenstatusdeskriptor des CuDv -Objekts des Geräts, um anzuzeigen, dass es verfügbar ist. Setzen Sie außerdem den Deskriptor Status ändern auf SAME, wenn er derzeit auf MISSING gesetzt ist. Dies kann auftreten, wenn die Einheit beim Systemboot nicht erkannt wurde und zur Laufzeit konfiguriert wird.
- Definieren Sie erkannte untergeordnete Einheiten, die derzeit nicht in der Objektklasse CuDv dargestellt sind. Rufen Sie dazu die Methode "Define" für jede neue untergeordnete Einheit auf. Für jede erkannte untergeordnete Einheit, die bereits in der Objektklasse CuDv definiert ist, überprüft die Konfigurationsmethode den Deskriptor CuDv des untergeordneten Geräts, um festzustellen, ob sie aktualisiert werden muss. Wenn der Deskriptor den Wert DONT_PFLEGEhat, muss nichts getan werden. Wenn er einen anderen Wert hat, muss er auf SAME gesetzt werden und das CuDv -Objekt der untergeordneten Einheit muss aktualisiert werden. Der Deskriptor für das Änderungsstatusflag wird vom System verwendet, um Konfigurationsänderungen anzuzeigen.
Wenn die Einheit eine Zwischeneinheit ist, aber keine angeschlossenen untergeordneten Einheiten erkennen kann, fragen Sie die Objektklasse CuDv zu diesen Informationen ab. Der Wert des Deskriptors "Statusflag ändern" für diese untergeordneten Geräte sollte DONT_PFLEGE lauten, da die übergeordnete Einheit sie nicht erkennen kann. Manchmal verfügt eine untergeordnete Einheit über ein Attribut, das für die Konfigurationsmethode angibt, ob die untergeordnete Einheit konfiguriert werden soll. Das Attribut Automatische Konfiguration von TTY-Einheiten ist ein Beispiel für diesen Attributtyp.
Unabhängig davon, ob die untergeordneten Einheiten erkannt werden, schreibt die Konfigurationsmethode die logischen Einheitennamen der untergeordneten Einheiten, die konfiguriert werden sollen, in die Standardausgabe, getrennt durch Leerzeichen. Wenn die Methode vom Konfigurationsmanager aufgerufen wurde, ruft der Manager die Konfigurationsmethode für jede untergeordnete Einheit auf, die in die Standardausgabe geschrieben wird.
- Schließen Sie alle Objektklassen und beenden Sie ODM. Schließen Sie alle Objektklassen und beenden Sie ODM. Wenn keine Fehler vorliegen, verwenden Sie den Code 0 (null) zum Beenden.
Dateien
| Element | Beschreibung |
|---|---|
| /dev/bus0 | Enthält POS-Register. |
| /dev/bus1 | Enthält POS-Register. |
| Verzeichnis ' /etc/microcode ' | Enthält Mikrocodedateien. Eine symbolische Verbindung zum Verzeichnis /usr/lib/microcode . |
| Verzeichnis /usr/lib/asw | Enthält heruntergeladene Adaptersoftware. |