-
Die
Erfindung betrifft Systeme und Verfahren zum Betrieb von Computern
und anderen Arten von mikroprozessorgestützten Systemen. Insbesondere betrifft
die Erfindung ein System und ein Verfahren zum Schnellstart eines
mikroprozessorgestützten Systems,
wie beispielsweise ein externes Programmiergerät zum Datenerfassen und Programmieren eines
Herz-Rhythmus-Steuergerätes.
-
Damit
ein Computer oder ein anderes mikroprozessorgestütztes System in einem betriebsbereiten
Zustand ist, in dem es zur Ausführung
mehrerer Anwendungsprogramme (d.h. solcher Programme, die dem System
spezielle Funktionalität
geben) imstande ist, muss das System unter der Überwachung einer Betriebssystem-Software
(OS) stehen. Dieser betriebsbereite Zustand umfasst in einem Speicher gespeicherten
speziellen Code und Daten, die dem Betriebssystem das Aufrechterhalten
der Überwachung
darüber,
wie die Systemressourcen auf die verschiedenen Anwendungsprozesse
verteilt sind, ermöglichen.
Das übliche
Mittel, durch das der betriebsbereite Zustand erreicht wird, ist
durch eine Boot-Sequenz, in der der Prozessor (CPU) die Ausführung (z.B.
während
des Startens aus einem abgeschalteten Zustand) an einer speziellen
Stelle in einem nichtflüchtigen
Festspeicher (ROM) beginnt. Das bedeutet, dass der Befehlszähler der
CPU (oder Befehlszeiger bei Intel x86-Architekturen) zunächst mit
der Startadresse der Software im ROM geladen wird, üblicherweise
als BIOS (basic input/output system) aufgrund anderer von der Software
ausgeführter
Funktionen bezeichnet. Der im ROM beinhaltete BIOS-Code definiert
die vom System beim Start durchgeführten grundlegenden Schritte
inklusive Hardware-Erkennung
und Initialisierung und Laden des Betriebssystems durch ein Systemeröffnungsprogramm.
-
Die
Ausführung
des Systemeröffnungsprogramms
bewirkt, dass die Startroutine aus dem Speichermedium, das die Betriebssystemsoftware
beinhaltet (z.B. eine Festplatte, Diskette, oder CD-ROM) in einen
Systemspeicher eingelesen wird, der üblicherweise ein flüchtiger
dynamischer Direktzugriffspeicher (DRAM) ist. Die Startroutine beinhaltet
ein Startprogramm, das anschließend
ausgeführt
wird, um den Prozess des Ladens des Betriebssystems in Speicher
aus dem Speichermedium zu laden.
-
Der
Prozess des Startens des Systems ist zeitaufwendig, da das Betriebssystem
bestimmte Berechnungen ausführen
muss, um sich selbst im speziellen System zu konfigurieren, inklusive
der Hardware-Detektion/-Initialisierung und der Einrichtung verschiedener
Datenstrukturen, die bei der Steuerung von Systemressourcen verwendet
werden, wie beispielsweise Speicher und Prozessorzeit. In bestimmten
Situationen ist für
ein System die Fähigkeit, schnell
in einen gestarteten betriebsbereiten Zustand überzugehen, ohne einen langwierigen
Startprozess zu durchlaufen, vorteilhaft. Die vorliegende Erfindung ist
im wesentlichen auf diese allgemeine Aufgabe gerichtet.
-
Aspekte
der Erfindung werden in den beigefügten Ansprüchen dargelegt.
-
Die
vorliegende Offenbarung umfasst ein System und ein Verfahren, einem
Computer oder einem anderen mikroprozessorgestützten System, wie beispielsweise
einem externen Programmiergerät
für ein
Herz-Rhythmus-Steuergerät,
das Übergehen
in einen Zielzustand, ohne einen Startprozess zu durchlaufen, zu
ermöglichen.
Ein bisheriges Verfahren zur Wiederherstellung eines betriebsbereiten
Zustands eines Computersystems ohne Durchlaufen eines Startprozesses
wird im US-Patent Nr.
5,710,930 (im
weiteren als '930-Patent bezeichnet)
beschrieben. Das '930-Patent
betrifft ein Verfahren zur Wiederherstellung eines betriebsbereiten
Zustandes eines Computersystems nach einem Abschalten, ohne einen
normalen Startprozess zu durchlaufen, bei dem das Betriebssystem
und der Anwendungscode in einem nicht-flüchtigen Systemspeicher gespeichert
sind und von dort ausgeführt
werden. Da das Betriebssystem und der Anwendungscode immer im nichtflüchtigen
Speicher verbleiben, wird der betriebsbereite Zustand dadurch wiederhergestellt, dass
die Prozessor-Register einfach wieder auf ihre Vor-Abschalt-Werte
gesetzt werden und anschließend
die Ausführung
des Codes an der passenden Stelle im Systemspeicher gestartet wird.
Das '930-Patent
beschreibt ein Abschaltprogramm, welches die Information in einem
Abschalt-Zustands-Buffer-Bereich einher mit den Vor-Abschalt-Inhalten
eines Grafikpufferspeichers speichert.
-
Die
vorliegende Erfindung betrifft im Gegensatz dazu ein System zur
Wiederherstellung eines Computersystems in einen betriebsbereiten
Zielzustand, ohne dabei einen Startprozess zu durchlaufen, wobei
die Inhalte (d.h. Betriebssystem und Anwendungscode) eines flüchtigen
Systemspeichers aus einem Zielzustandsbild, das in einem nichtflüchtigen
Bildspeichermedium gespeichert ist, rekonstruiert werden. Der Zielzustand
ist ein gestarteter betriebsbereiter Zustand, in dem das Betriebssystem die
Kontrolle über
die Systemressourcen hat, und Anwendungsprogramme entweder in den
Speicher geladen werden oder zum Laden aus einem Speichermedium
durch das Betriebssystem zur Verfügung stehen. Entsprechend der
Offenbarung wird ein Bild des Zielzustands festgehalten und in einem nicht-flüchtigen
Bildspeichermedium gespeichert. Das Bild des Zielzustands umfasst
die Inhalte des flüchtigen
DRAM-Speichers und
die in den Prozessor-Registern gespeicherten Werte, wenn das System
im Zielzustand ist. In einer Ausführungsform wird die Wiederherstellungsroutine,
die in einem nicht-flüchtigen
Speicher enthalten ist, während des Startens
des Systems ausgeführt.
Die Wiederherstellungsroutine entnimmt anschließend das Zielzustandsbild aus
dem Bildspeichermedium und beginnt den Prozess der Wiederherstellung
des Zielzustands. Nachdem der Systemspeicher und die Register mit
dem Zielzustand korrespondierenden Werten geladen sind, wird die
Prozessor-Ausführung an
eine Betriebssystem-Rückkehrroutine übertragen,
die die Kontrolle über
das System der Betriebssystemsoftware zurückgibt.
-
Entsprechend
der Offenbarung umfasst das im Bildspeichermedium enthaltene Zielzustandsbild ein
Speicherbild und eine Zielzustands-Datenstruktur. Die Zielzustands-Datenstruktur enthält in den
Registern des Prozessors zu speichernde Werte und Information, die
der Wiederherstellungsroutine das richtige Speichern des Speicherbilds
in den Systemspeicher ermöglichen.
In einer Ausführungsform
wird das Speicherbild durch direktes Kopieren von Inhalten aus dem
flüchtigen
Systemspeicher gebildet. Die kopierten Inhalte werden anschließend im
Bildspeichermedium mit oder ohne Datenkompression gespeichert. Das
Speicherbild kann anschließend
direkt aus dem Bildspeichermedium durch die Wiederherstellungsroutine
in passende Speicherorte kopiert werden. In einer weiteren Ausführungsform
wird das Zielzustandsbild durch eine Bildspeicherroutine erzeugt,
die das vom Betriebssystem implementierte Paging-Schema verwendet,
um ein aus Speicheradressbereichen hergestelltes Speicherbild zu
erzeugen, d.h. nur den Speicherorten entsprechend, die tatsächlich vom
Betriebssystem im Zielzustand verwendet werden. Information der
vom Betriebssystem erhaltenen Seitentabellen werden anschließend in die
Zielzustands-Datenstruktur kopiert, um die Wiederherstellung der
Speicheradressbereiche im Speicher durch die Wiederherstellungsroutine
zu ermöglichen.
-
Kurzbeschreibung
der Zeichnungen
-
1 ist ein System-Diagramm
eines mikroprozessorgestützten
Systems, das zum Integrieren eines den Ausführungsformen der Erfindung
entsprechenden Systems geeignet ist.
-
2 Ist ein Blockdiagramm
der Software-Komponenten für
eine spezielle Implementierung der Erfindung.
-
Detaillierte
Beschreibung
-
Die
vorliegende Erfindung kann als System zur Übertragung eines durch eine
Betriebssystemsoftware gestarteten mikroprozessorgestützten Systems
in einen Zielzustand ausgeführt
werden. Das System wendet eine Wiederherstellungsroutine zum Wiederherstellen
des flüchtigen
Systemspeichers und der Prozessorregister an, um dem Zielzustand zu
entsprechen. Ein Bildspeichermedium enthält ein Bild des aus einem Speicherbild
und einer Zielzustands-Datenstruktur
bestehenden Zielzustands. Das Bildspeichermedium ist ein nicht-flüchtiger
Speicher oder Speichergerät,
wie beispielsweise ein elektrisch löschbarer programmierbarer Festwertspeicher
(EEPROM, auch bekannt als flash-ROM), eine Festplatte, eine Diskette,
ein ferro-elektrischer
Speicher, ein batterie-gesicherter RAM, oder ein optisches Speichermedium.
Die Wiederherstellungsroutine ist in einem nicht-flüchtigen
Speicher, wie beispielsweise einem flash-ROM oder einem batterie-gesicherten RAM,
enthalten, kann sich aber während
der Ausführung
in einen Bereich des flüchtigen Speichers,
der als im Zielzustand unbenutzt bekannt ist, verschieben. Die Wiederherstellungsroutine
ist typischerweise im gleichen Medium wie das System-BIOS enthalten
und wird anstelle des Startprogramms des BIOS ausgeführt. Das
Bildspeichermedium kann ein flash-Rom oder ein anderes nicht flüchtiges
Speichermedium mit ausreichender Speicherkapazität, wie beispielsweise eine
Festplatte, sein. Die Wiederherstellungsroutine beinhaltet Code
zum Abrufen des Speicherbildes und der Zielzustands-Datenstruktur
aus dem Bildspeichermedium. Nach der Wiederherstellung des flüchtigen
Speichers und der Prozessorregister entsprechend dem Zielzustand
wird die Prozessorausführung
auf eine Betriebssystem-Rückkehrroutine
durch Laden des Prozessor-Befehlszeigers
mit der Adresse der Routine übertragen.
Die Betriebssystem-Rückkehrroutine übergibt
anschließend
die Kontrolle des Systems nach dem Durchführen jeglicher nötiger Einstellungen
der Betriebssystemsoftware.
-
Eine
Zielzustandsbildspeicherroutine, die vom Betriebssystem ausgeführt wird,
kann dazu verwendet werden, ein Zielzustandsbild zu erzeugen und
zu speichern. In einer Ausführungsform
wird eine Kopie der Inhalte aller flüchtigen Speicher im Zielzustand
als Teil des Zielzustands gespeichert. Um die Größe des Zielzustandsbilds zu
reduzieren, können Datenkompressionstechniken
auf die Speicherinhalte vor dem Speichern angewandt werden. In einer weiteren
Ausführungsform
der Erfindung werden anstelle des Speicherns des gesamten Inhalts
des flüchtigen
Speichers nur die Inhalte von Stellen im flüchtigen Speicher als Speicherbild
gespeichert, die tatsächlich
vom System im Zielzustand benutzt werden. Die Größe des Speicherbildes, das
gespeichert werden muss, um den Zielzustand wiederherzustellen,
wird so verringert. (Weitere Verringerung kann durch das Verwenden
von Datenkompressionstechniken zum Komprimieren des Speicherbildes
erreicht werden.) Um dies zu bewerkstelligen, verwendet die Bildspeicherroutine
das Paging-Schema des Betriebssystems, um die verwendeten Speicherstellen in
einem Zielzustand zu identifizieren. Paging ist eine Technik, bei
der das Betriebssystem Speichereinheiten, die Seiten genannt werden,
in einem linearen Adressbereich zuordnet und diese Seiten auf Speicheradressbereichen
im physikalischen Adress-Speicher abbildet (d.h. auf physikalische Stellen
im Speicher). Der lineare Adressbereich kann größer sein als der physikalische
Adressbereich mit nichtabgebildeten Seiten, die in einem Speichermedium
wie beispielsweise einer Festplatte aufbewahrt und bei Bedarf kopiert
werden und so einen Weg der Implementierung eines virtuellen Speichers
zu schaffen. Vom Betriebssystem erhaltenen Seitentabellen und der
Paging-Mechanismus des Prozessors schaffen die Seiten-auf-Speicheradressbereiche-Abbildungsfunktion.
Das Speicherbild entspricht Seiten im linearen Adressbereich, die
auf Speicheradressbereiche im physikalischen Adressbereich durch
das Paging-Schema des Betriebssystems im Zielzustand abgebildet
werden. Es repräsentiert
daher nur die Inhalte der Speicherstellen, die tatsächlich im
Zielzustand verwendet werden. Die Zielzustands-Datenstruktur enthält aus den
Seitentabellen des Betriebssystems erhaltene Information, die das
gespeicherte Speicherbild zu physikalischen Adressen in Beziehung
setzt. Die Wiederherstellungsroutine ruft die Zielzustands-Datenstruktur
aus einer bekannten Stelle im Bildspeichermedium ab. Der Code in
der Wiederherstellungsroutine kopiert anschließend das Speicherbild in den
flüchtigen
Speicher so, dass die Speicheradressbereiche des Zielzustands wiederhergestellt
werden. Die Zielzustands-Datenstruktur beinhaltet auch die Inhalte
der Register des Prozessors im Zielzustand, so dass die Register
mit den Werten von der Wiederherstellungsroutine wiedergeladen werden
können.
-
Wie
zuvor gesagt, wird eine Zielzustandsbild-Speicherroutine ausgeführt, um
eine Momentanaufnahme des Zielzustandes aufzunehmen. Ein Zielzustandsprozess
kann zuerst ausgeführt
werden, um das System in den gewünschten
Zielzustand zu bringen, bevor die Bildspeicherroutine aufgerufen
wird. Um die Systemressourcen zu isolieren und un beschränkten Speicherzugriff
zu erlauben, während
ein Bild des Systems aufgenommen wird, wird die Bildspeicherroutine
als Interrupt-Wartungsroutine implementiert, die auf der Kernel-Vorrechts-Ebene
mit deaktivierten Interrupts abläuft.
Das Plattendateisystem wird von der Bildspeicherroutine außer Betrieb genommen,
so dass keine Veränderungen
an den Festplattendateien während
des Bildaufnahmeprozesses gemacht werden. Nachdem das Bild im Bildspeichermedium
gespeichert ist, springt der Ablauf in die Betriebssystem-Rückkehrroutine,
die das Dateisystem wieder in Betrieb nimmt, die Interrupts reaktiviert
und eine Interrupt-Rückkehr
zum Zielzustandsprozess ausführt,
um dem Betriebssystem die Kontrolle zurück zu überlassen. Dies ist die gleiche
Betriebssystem-Rückkehrroutine,
in die durch die Wiederherstellungsroutine in den letzten Schritten
der Wiederherstellung des Zielzustands gesprungen wird. Die Betriebssystem-Rückkehrroutine
ist daher in den Speicheradressbereichen des Zielzustands enthalten.
-
Bei
der Aufnahme des Zielzustandsbilds fragt die Bildspeicherroutine
das gegenwärtig
verwendete Paging-Verzeichnis
und die Paging-Tabellen ab und erzeugt eine Kopie des mit Linearadressen
von Pagingtabellen gefüllten
Seitenverzeichnisses. Diese Struktur ermöglicht das Übersetzen von Linearadressen
in physikalische Adressen. Die Bildspeicherroutine erzeugt des weiteren
eine Liste von physikalischen Adressen von Speicheradressbereichen,
die im flüchtigen
Speicher gespeichert sind, aus den Inhalten von Seitentabellen.
Eine Liste von Linearadressen von Seiten, die auf Speicheradressbereiche
im Speicher im Zielzustand abgebildet werden, wird ebenfalls erzeugt,
um die Übersetzung
von physikalischen Adressen in Linearadressen durch Indexierung
in der Liste mit physikalischen Adressen zu ermöglichen. Die Zielzustandsbild-Speicherroutine verwendet
die Liste von Linearadressen von abgebildeten Seiten und die Liste
von physikalischen Adressen von Speicheradressbereichen, um das Speicherbild
zum Speichern im Bildspeichermedium zu erzeugen.
-
In
dem Fall, in dem das Bildspeichermedium ein flash-ROM ist, muss
die Bildspeicherroutine das Paging-Schema zum Zugriff verwenden.
Entsprechend ist ein Code in der Zielzustandsspeicherroutine vorgesehen
zum: a) Erhalten einer physikalischen Adresse des Bildspeichermediums
aus einer Hardware-Konfigurationsdatei, b) Direktkorrektur (patching)
eines Leereintrages des Seitenverzeichnisses mit einer physikalischen
Adresse einer Seitentabelle, die erzeugt wurde, um die physikalischen
Adressen des Bildspeichermediums zu enthalten, c) Zugreifen auf
das Speichergerät
mit einer Linearadresse, die dem korrigierten Eintrag im Seitenverzeichnis
und der Seitentabelle, auf die dadurch gezeigt wird, entspricht,
und d) Speichern des Speicherbilds und der Zielzustands-Datenstruktur im
Bildspeichermedium. Ist das Bildspeichermedium eine Festplatte,
so werden andererseits während
des Bildaufnahmeprozesses aus den oben genannten Gründen das
Dateisystem abgeschaltet und die Interrupts deaktiviert. Daher ist
in der Zielzustands-Speicherroutine Code vorgesehen zum: a) Zugreifen
auf die Festplatte ohne Interrupts, b) Interpretieren einer Partitionstabelle
auf der Festplatte, um eine vorgesehene Speicherdatei zu finden
und eine Linearblockadresse davon zu berechnen, und c) Speichern
der Zielzustands-Datenstruktur und des Speicherbildes in der vorgesehenen Speicherdatei.
-
Da
kein Betriebssystem vorhanden ist, bevor der Zielzustand erreicht
ist, wird die Abfrage und das Speichern des Speicherbilds durch
die Wiederherstellungsroutine unter Verwendung physikalischer Adressen
und ausgeschaltetem Paging ausgeführt. Die Zielzustands-Datenstruktur
beinhaltet ein Liste physikalischer Adressen, den Stellen im flüchtigen Speicher
entsprechen, in denen Speicherad ressbereiche im Zielzustand gespeichert
werden. Die Liste wird anschließend
von der Wiederherstellungsroutine verwendet, um das Speicherbild,
das aus dem Speichergerät
abgefragt wurde, in den flüchtigen Speicher
an ausgewählte
Stellen zu speichern. Die Wiederherstellungsroutine schaltet anschließend das Paging
vor dem Übergang
zur Betriebssystem-Rückkehrroutine
ein. Die Zielzustands-Datenstruktur
enthält
die physikalischen Adressen des Seitenverzeichnisses im Zielzustand,
und die Wiederherstellungsroutine beinhaltet dann Code zum: a) Direktkorrigieren
des Seitenverzeichnisses, so dass physikalische Adressen der Wiederherstellungsroutinenbefehle
auf die gleichen physikalischen Adressen abgebildet werden, b) Speichern
von Information zur Rück-Korrektur
des Seitenverzeichnisses in die Zielzustands-Datenstruktur, und
c) Ermöglichen
des Paging vor dem Springen in die Betriebssystem-Rückkehrroutine.
Die Zielzustands-Datenstruktur enthält die physikalischen Adressen,
die den Speicherstellen der Zielzustands-Datenstruktur im Zielzustand
entsprechen, und ermöglicht
der Wiederherstellungsroutine das Schreiben in die Zielzustands-Datenstruktur.
Der Code in der Betriebssystem-Rückkehrroutine
entwertet dann die Verschiebungspufferspeicher des Paging-Mechanismus
und re-korrigiert das Seitenverzeichnis mit Information, die in
der Zielzustands-Datenstruktur enthalten ist.
-
Die
folgende Beschreibung ist eine beispielhafte Implementierung, bei
der ein erfindungsgemäßes System
in ein externes Programmiergerät
für ein Herzrhythmus-Steuerungsgerät (z.B.
einen Schrittmacher) eingebracht wird. Das Programmiergerät ist damit
mit der Möglichkeit
eines Schnellstarts aus einem ausgeschalteten Zustand versehen,
ohne einen langwierigen Startprozess zu durchlaufen, und so für den Kliniker
und den Patienten Zeit zu sparen, wenn der Schrittmacher entweder
zum Zeitpunkt des Einsetzens oder in der folge überwacht und/oder program miert
wird. Es wurde gezeigt, dass die beschriebene Implementierung in
der Lage ist, von einem ausgeschalteten in einen betriebsbereiten
Zustand in weniger als zwanzig Sekunden überzugehen, ein Ergebnis, das
bislang von keinem derzeitig erhältlichen mit
einem 16-bit- oder größeren Mikroprozessor
arbeitenden externen Programmiergerät erreicht wurde.
-
Wie
in 1 dargestellt, ist
das Programmiergerät
in diesem Beispiel ein mikroprozessorgestütztes System 10, das
einen Pentium-Prozessor 12, einen DRAM-Speicher 14,
ein Festplattenlaufwerk 16 mit integriertem Controller,
einen Grafikadapter 18 zum Betreiben eines Bildschirms,
einen Tastatur/Maus-Controller 20 und einen nichtflüchtigen flash-ROM-Speicher 35 umfasst.
Die Komponenten sind mit dem System über einen System-Bus 30 oder einen
PCI-Bus 40 verbunden. Ebenfalls verbunden mit dem System über einen
ISA-Bus ist ein I/O-Untersystem, das Telemetrie und EKG-Schaltungen
umfasst, jede mit einem Prozessor, einem Speicher und I/O-Interface-Schaltungen.
Das flash-ROM 35 enthält das
BIOS (basic input/output system) und eine Wiederherstellungsroutine,
die den DRAM-Speicher und die Prozessor-Register in einen Zielzustand
während des
Startens der Einheit wiederherstellt. Bei einer solchen Konfiguration überträgt die BIOS-Startroutine
die Kontrolle an die Wiederherstellungsroutine, nachdem die normale
Hardware-Erkennungs- und Initialisierungsaufgaben abgeschlossen
sind, anstatt das Betriebssystems von der Festplatte zu starten. Das
Zielzustandsbild, das ein Speicherbild und eine Zielzustandsdatenstruktur
enthält,
ist entweder auf der Festplatte oder im flash-ROM gespeichert und wird
von der Wiederherstellungsroutine zum Laden in den Speicher und
die Prozessor-Register entnommen, um das System in den Zielzustand
zu bringen. Das I/O-Untersystem 22 weist
ebenfalls flash-ROM-Speicher für
die EKG- und Telemetrie-Schaltungen auf, die Wiederherstel lungsroutinen enthalten
können,
um ein schnelleres Starten dieser Systeme zu ermöglichen. Die Telemetrie- und EKG-Schaltungen
enthalten auch DSPs (digitale Signalprozessoren), die einen Flashspeicher
für ihren Start
aufweisen wie auch zum Filtern, Steuern und funktionelle Algorithmen.
Die Verwendung von flash-ROM-Speichern als Zielzustandsbild-Speichermedium
für sowohl
das Hauptsystem 10 wie auch das I/O-Untersystem 22 schafft
einen schnelleren Start als ein Festplattenlaufwerk, da der Flashspeicher
sofort nach dem Herstellen der Versorgung initialisiert wird, wohingegen
das Festplattenlaufwerk 3 bis 5 Sekunden zum Initialisieren aufgrund
der Motoranlaufzeit benötigt.
Zugriffszeiten sind bei flash-ROM-Speichern ebenfalls schneller.
-
In
dieser beispielhaften Implementierung ist die verwendete Betriebssystem-(OS)
Software das QNX-Betriebssystem zusammen mit der grafischen QNX-Windows-Benutzeroberfläche. QNX
ist ein Echtzeit-Betriebssystem, das die Speicherverwaltung und
die Ressourcenzuordnung für
unter ihm laufende Anwendungsprogramme, die eine spezielle Funktionalität für das Programmiergerät (z.B.
Telemetrie- und
EKG-Verfahren) vorsehen, bietet. Das Zielzustandsbild kann nur QNX
enthalten, wobei alle Anwendungsprozesse von der Festplatte geladen werden,
oder kann zusätzlich
einen oder mehrere Anwendungsprozesse enthalten, die direkt nach
dem Erreichen des Zielzustandes gestartet werden. Weitere Anwendungsprozesse
können
anschließend
von der Festplatte auf normalem Weg durch das Betriebssystem geladen
werden, wenn sie benötigt
werden.
-
Wie
oben beschrieben, besteht das Schnellstart-System, das im Programmiergerät enthalten
ist, aus drei Haupt-Software-Komponenten,
wie in 2 dargestellt:
eine Wiederherstellungsroutine 200, eine Zielzustandbild-Speicherroutine 100,
und eine Betriebssystem-Rückkehr routine 300.
Die Wiederherstellungsroutine enthält den gesamten Code und die Datenstruktur,
die bei der Wiederherstellung des Systems in den Zielzustand verwendet
werden und befindet sich im BIOS-Adressbereich (d.h. im das BIOS
beinhaltenden ROM oder flash-ROM). Sie wird anstelle des BIOS-Startprogramms
ausgeführt, nachdem
das BIOS seine Hardware-Initialisierungsaufgaben abgeschlossen hat.
Da die Hardwarekomponenten bei dieser Implementierung vorab bekannt sind,
ist der Initialisierungs-Code im BIOS modifiziert, um voreingestellte
Werte in Hardware-Registern
zu speichern anstatt eine algorhitmische Hardware-Erkennung und
eine Initialisierungs-Prozedur zu durchlaufen, um die Startzeit
weiter zu verringern. Nach dem Abschließen der Zustands-Wiederherstellungs-Prozedur
wird ein Sprung in die Betriebssystem-Rückkehrroutine 300 im
QNX-Adressbereich gemacht, was, wie unten beschrieben, auch das
Ende der Zielzustands-Speicherroutine ist. Die Zielzustandsbild-Speicherroutine 100 und
die Betriebssystem-Rückkehrroutine 300 sind
QNX-Prozesse, die sich im von QNX zugeordneten Adressbereich befinden.
Ein weiterer QNX-Prozess, der Zielzustandsprozess 99, wird
ausgeführt,
wenn gewünscht
wird, ein Zielzustandsbild zu speichern. Der Zielzustandsprozess
bringt das System in einen durch eine Konfigurationsdatei und/oder
Kommandozeilenparameter definierten Zielzustand, und ruft dann die
Bildspeicherroutine 100 als Interrupt-Wartungsroutine auf. Nachdem
das Zielzustandsbild im Bildspeichermedium gespeichert ist, springt
die Bildspeicherroutine in die Betriebssystemrückkehrroutine 300,
die anschließend
zum Zielprozess 99 durch Ausführen eines Interrupt-Rückkehr-Befehls
zurückkehrt.
Der Zielzustandsprozess 99 endet und die Kontrolle wird
an QNX zurückgegeben.
-
Die
Funktion der Wiederherstellungsroutine 200 liegt darin,
das System von einem nicht-betriebsbereiten (z.B. ausgeschalteten)
Zustand in einen Zielzustand zu bringen, in dem das Betriebssystem geladen
und Anwendungen zum Ausführen
bereit sind. Die meiste Zeit während
des Startens des Betriebssystems wird zum Laden der Betriebssystemdateien
und Lesen der Konfigurationsdateien und zur Hardware-Erkennung aufgewendet,
was mehrere Unterbrechungen (time-outs) und Anschlussabfragen einschließt. Da die
Hardware in dieser Implementierung fest ist, kann eine Momentaufnahme
des Systemspeichers, der CPU-Register und aller vom Betriebssystem
zu dem Zeitpunkt, zu dem die Momentaufnahme gemacht wird, initialisierten
Hardware, gemacht werden, um ein Bild des Zielzustands zu erzeugen.
Wird das System später
in diesen Zielzustand des Bildes gebracht, so meint das Betriebssystem,
dass es gerade den kompletten Startprozess durchlaufen habe, da
kein Unterschied zwischen dem gestarteten und dem wiederhergestellten
Zustand in Bezug auf alles, worauf das Betriebssystem zugreifen
und was das Betriebssystem verwendet, ist. Zusätzliche eingeschlossene Ausgaben
lassen das Betriebssystem den Zeitunterschied zwischen gespeichertem
Bild und gegenwärtiger
Zeit und möglichen Änderungen
am Dateisystem erkennen.
-
Das
Speichern des Bildes schließt
den Zugriff auf der niedrigsten Systemressourcenebene ein, dies
muss durch Code-Ausführung
auf der Kernel- oder Ring 0- Vorrechtsebene geschehen. Dies wird erreicht,
indem der Code der Speicherroutine 100 in ein Unterbrechungsprogrammm
(interrupt handler) eingesetzt wird und anschließend ein Interrupt erzeugt
wird, um so die Steuerung dem Speicher-Code zu übergeben, dessen Ablauf im
Ring 0 dadurch sichergestellt ist. Die Bildspeicherprozedur wird
vom Betriebssystem ausgelöst,
indem zunächst
der Zielzustandsprozess 99 ausgelöst wird, der das System in
den Zielzustand bringt, bevor die Bildspeicherroutine 100 ausgeführt wird.
Die Priorität
des Zielzustandsprozesses 99 wird erhöht, da es nichts anderes mit
höherer
Priorität
gibt.
-
Mehrere
Prozesse werden nach dem Wiederherstellen des Zielzustandes ausgeführt. Der Echt-Zeit-Takt
wird mit dem Hardware-Takt synchronisiert, der Maustreiber wird
reinitialisiert, und die grafische Windows-Benutzeroberfläche wird
neu gestartet. Zusätzlich
sollte wenigstens ebenfalls eine Anwendung gestartet werden, da
das Ziel der Implementierung das Starten eines funktionsfähigen externen
Programmiergerätes
für ein
Herz-Rhythmus-Steuergerät
ist. Das Starten einer Anwendung erfordert das Lesen der Datei von
der Festplatte, was ein langsamer Prozess ist. Unix-Betriebssysteme
wie beispielsweise QNX ermöglichen,
dass eine Anwendung in den Speicher geladen wird und anschließend in
einem ausgesetzten Zustand gehalten wird, bis ein Signal zum tatsächlichen
Ausführen
empfangen wird. Dieser Ansatz wird in dieser Implementierung gewählt, wobei
mehrere Prozesse von der Festplatte gelesen werden, bevor das Systembild
gespeichert wird, und folglich die Zeit, die dazu verwendet wird, die
Anwendungen zum Ablaufen zu bringen, nachdem das Bild wiederhergestellt
ist, verringert wird. Abhängig
von der Eingabe der Kommandozeilenparameter beim Ausführen des
Zielzustands-Prozesses 99 werden
eines oder mehrere Programme von der Platte gelesen und in den Speicher
geladen, wo sie in einem ausgesetzten Zustand gehalten werden. Das
vom Bildspeicherprozess aufgenommene Zielzustandsbild enthält dann
diese ausgesetzten Prozesse in den Prozesstabellen des Betriebssystems. Der
Prozess 99 liest auch die System-Zeit-Größe (system
timer granularity) durch Aufrufen der QNX-Funktion qnx osinfo. Der
Zeitgeber-Größen-Wert
(timer granularity value) muss nach dem Wiederherstellen des Zielzustandes
wiederhergestellt werden, da nicht garantiert ist, dass das Setzen des
Zeitgebers durch das BIOS gleich ist wie das durch QNX.
-
Anschließend wird
das Dateisystem durch den Zielzustandprozess 99 abgeschaltet,
da die Anwendung Veränderungen
auf der Festplatte bewirken kann, und der wiederhergestellte Zielzustand
von diesen Veränderungen
nichts weiß.
Das Abschalten des Dateisystems garantiert, dass alle Dateien während der
Bildspeicherprozedur geschlossen sind, und das nachfolgende Wiederanschalten
des Dateisystems während
der Zielzustands-Wiederherstellungsprozedur
bewirkt, dass das Verzeichnis auf der Festplatte neu gelesen wird,
so dass alle Änderungen,
die seit dem Zeitpunkt, an dem das Bild gespeichert wurde, nachgeführt werden.
Zusätzlich
halten die Cache-Puffer Dateidaten der kürzlich geöffneten Dateien. Obwohl das
Plattenverzeichnis neu gelesen wird, wenn das System versucht, die
geänderte
Datei zu öffnen
und zu lesen, wird das Betriebssystem die Daten aus dem Cache vorsehen,
anstatt sie von der Festplatte zu lesen. Deswegen werden die Cache-Puffer
gelöscht.
-
Die
Zielzustandsbild-Speicherfunktion 100 ist an den nicht-maskierbaren
Interrupt (NMI) als Interrupthandler angehängt. Der Zielzustandprozess erzeugt
daher einen NMI, um die Steuerung an die Bildspeicherroutine 100 zu übertragen.
Der Code wird dann in Ring 0 ausgeführt, fertig zum Speichern des
Systembilds. Die Zustandsspeicherfunktion 110, die alle
Register zur allgemeinen Benutzung und Segment-Register im Stapel
speichert, wird anschließend
aufgerufen, wobei die Daten-Segment-Register das Datensegment des
Zielzustands-Prozess nachführen.
Anschließend
setzt sie die FS-Register, um auf dieses Datensegment zu zeigen,
da es sehr viel günstiger
ist, dass das Datensegment-Register 0-basiert ist. Die Segment-Register
DS und ES werden anschließend
mit dem QNX-FLAT-SEG-Wert gesetzt, der ein 0-basiertes 4 GB-Segment
definiert.
-
Das
QNX-Betriebssystem benutzt den Paging-Mechanismus des Pentium-Prozessors,
was bedeutet, dass physikalische Adressen des Speichers nicht einfach
berechnet werden. Da ein Bild des physikalischen Speichers gespeichert
werden soll, muss jedoch die in den Seitetabellen enthaltene Information
extensiv genutzt werden. Da dies ein zeitaufwändiger Prozess ist, wird einige
vorbereitende Arbeit von der SaveInit-Funktion 120 übernommen,
um die Übersetzung
zu unterstützen.
Die im Zielzustandsbild gespeicherte Systeminformation wird in einer
Zielzustands-Datenstruktur
gehalten, die in dieser Implementierung als CSS-Struktur 400 bezeichnet
wird. Das Pentium-Steuerregister
CR3 hält
die physikalischen Adressen des Seitenverzeichnisses und wird im
CSS gespeichert. Jede Übersetzung
von Adressen beinhaltet ein Durchgehen durch das Seitenverzeichnis,
und beinhaltet physikalische Adressen von Seitentabellen. Da die
Verwendung physikalischer Adressen eine weitere Übersetzung benötigt, wird
das Seitenverzeichnis eingelesen und in das Page_Xdir-Array 140 kopiert,
das mit übersetzten
Linearadressen gefüllt
ist. Auf diese Art kann jedes Mal, wenn eine physikalische Adresse
benötigt wird,
eine Seitentabelle anhand ihrer Linearadresse aus dem übersetzten
Seitenverzeichnis gefunden werden. Die FixPageTable-Funktion 130 geht
durch das Seitenverzeichnis, übersetzt
alle benutzten Einträge
und füllt
sie in das Page_Xdir-Array 140. Die Linearadresse des Seitenverzeichnisses
hingegen ist in der Variablen PageDirAddr 145 gespeichert.
-
Um
während
der Wiederherstellungsprozedur Zeit und Platz beim Speichern des
Zielzustandsbilds zu sparen, speichert die Bildspeicherroutine nur Seiten
des Speichers, die im physikalischen Speicher vorhanden sind, nicht
mit Nullen aufgefüllt
sind und tatsächlich
benutzt werden (d.h. Speicheradressbereiche). Die Startadressen
dieser Seiten werden wieder in den Seitentabellen gefunden, und
sind physikalischer Art, es werden allerdings Linearadressen benötigt, um
auf die Seiten gelangen zu können. Daher
wird ein Array mit Linearadressen aufgebaut und mit Startadressen
jeder benutzten Seite gefüllt. Einhergehend
mit dieser Liste wird die Liste von Ausschließungen aufgebaut, die Teil
der CSS-Struktur ist. Sie beinhaltet physikalische Adressen der
letzten vor der Lücke
(gap) zu speichernden Seite, und dann die erste wieder verwendete
Seite. Die Zielzustands-Wiederherstellungsprozedur wird diese Liste durchgehen
und Start- und Stopadressen entnehmen. Die Listen werden durch die
FixPageList-Funktion 150 aufgebaut, das Array der Linearadressen wird
mit PageList-Array 152 bezeichnet, und das Array der Start/Stopadressen
wird mit BlockList-Array 154 bezeichnet.
-
Tritt
während
des Aufbaus der Liste mit übersetzten
Adressen ein Problem auf, wenn beispielsweise der Speicher zu stark
fragmentiert ist und die Liste nicht in die CSS-Struktur passt, wird die BreakFlag-Variable 156 auf
1 gesetzt. Sobald die SaveInit zurückkehrt, wird dieser Merker
(flag) geprüft.
Wenn er gesetzt ist, kehrt die Steuerung direkt zum Bildprozess 99 zurück, ohne
das tatsächliche
Speichern des Zielzustandsbilds zu durchlaufen. Wenn die SaveInit zurückkehrt,
wird die Steuerung an die SetupFsBase-Funktion 160 übergeben.
Diese Funktion berechnet die 0-basierten Linearadressen des Starts
des Bildspeicherroutinen-Codes/Datensegments. Auf diese Art wird
für jede
Berechnung, die identisch abgebildete Adressen benötigt (gleich
mit und ohne Paging, so dass die Linearadressen den physikalischen Adressen
entsprechen), die Verschiebung innerhalb des Codes oder Datensegments
zu dieser Basis hinzuaddiert. Die Funktion nimmt die Werte des Code-Segment-Registers
und durchläuft
die GDT (global descriptor table) und möglicherweise die LDT (lo cal
descriptor table), um die Bezeichnung für das Code-Segment zu finden, die die Segment-Basis
enthält.
-
Wird
die Festplatte als Bildspeichermedium verwendet, wird eine Datei
zum Speichern des Bildes von der File-Found-Funktion 170 auf der
Platte angeordnet. Sie benutzt DIE-Plattenzugriff mit niedrigem Level
zum Lesen/Schreiben, ohne Interrupts zu benutzen. Dieser Code weiß, wie die
Partitionstabelle zu interpretieren ist, lokalisiert die FAT16-Partitionen und
findet den ersten Cluster einer mit FLASHIMG.DAT bezeichneten Datei,
in der das Zielzustandsbild gespeichert wird. Die ClusterToLBA-Funktion 172 berechnet
die LBA (linear block adress) des ersten Clusters der Datei FLASHIMG.DAT,
so dass die Speicherfunktionen wissen, an welcher Stelle der Platte
Daten geschrieben werden können.
-
Wird
ein flash-ROM als Bildspeichermedium verwendet, muss das Seitenverzeichnis
direktkorrigiert (patched) werden, um vom Flash verwendete Adressen
für die
CPU zugreifbar zu machen. Zunächst
wird die physikalische Adresse des Flash aus den PCI-Konfigurationsdaten
ermittelt und in den Seitenverzeichnisfeldern verwendet. Die verfügbare Linearadresse
wird gefunden, indem das Seitenverzeichnis auf zwei folgende Leereinträge durchsucht wird,
um 8 MB Flash-Platz zu ermöglichen.
Diese beiden Einträge
werden mit den Adressen von zwei Seitentabellen korrigiert, die
wir in unserem eigenen Datensegment erzeugen. Die Startadresse der
Seitentabellen ist an den 4 K-Bereich angepasst, und die resultierende
Linearadresse wird in die 0-basierte
Linearadresse durch Hinzuaddieren der FS-Basis zu ihr konvertiert,
und wird schließlich
in die physikalische Adresse konvertiert, die in das Seitenverzeichnis
gefüllt
werden kann. Anschließend
werden alle Einträge in
den Seitentabellen mit physikalischen Adressen des flash-ROM gefüllt, und
der flash-ROM wird gelöscht.
-
Nun
wird die Steuerung an die Schreib-Funktion 180 übertragen,
die all die Systeminformation in den flash-ROM oder auf die Festplatte
schreibt. Die folgenden Pentium-Register
werden in das CSS gespeichert: Merker (flags), CS:EIP, SS:ESP, CR0, CR2,
CR3, CR4, TR, GDTR, LDTR, und IDTR. Die Interrupt-Masken werden
aus dem PIC (programmable interrupt controller) gelesen und in das
CSS gespeichert. Der Ident-Befehl wird an die Festplatte gesandt,
und die Einstellung für
die mehrfachen Sektor-Transfers
und gegenwärtig
gesetzte Geometrie wird aus den Ident-Daten ausgelesen und in die
lokalen Variablen gespeichert. Diese Daten brauchen nicht in der
CSS-Struktur gespeichert zu werden, da sie vom Wiederherstellungsprozess
nicht verwendet werden. Wenn die Wiederherstellungsroutine in den QNX-Code
zurückspringt,
kann dieser Code leicht seine lokalen Variablen lokalisieren. Die
Adresse der CSS-Struktur wird in 0-basierte Linear- und anschließend physikalische
(Adressen) konvertiert und innerhalb des CSS gespeichert. Auf diese
Art kann die Wiederherstellungsroutine 200 tatsächlich Daten
in das CSS schreiben, so dass die letzten Wiederherstellungsschritte
diese Daten verwenden können. Der
Cache wird zurückgesetzt
und gelöscht,
um den Speicher-Zusammenhang (coherency) sicherzustellen, und das
CSS wird in das Bildspeichermedium geschrieben. Nun geht die Speicherprozedur
in eine Schleife, in der alle Adressen von 0 bis zur Spitze des RAM
in Linearadressen konvertiert und in das Bildspeichermedium gespeichert
werden. Einige Seiten werden jedoch nicht gespeichert. Die in der
BlockList als nicht vorhanden markierten Adressen werden nicht gespeichert,
und Adressen von A0000 bis 100000 werden nicht gespeichert, da sie
nicht RAM enthalten, sondern BIOS- und ROM-Erweiterungen enthalten. Die Konversion
von physikalischen Adressen in Linearadressen wird durch einfach
Inde xieren in das PageList-Array gemacht. Alle Speicherungen werden
in 4 K-Stücken,
der Größe einer
Seite, gemacht.
-
Ist
der Speicherprozess abgeschlossen, wird ein Sprung in die Betriebssystem-Rückkehrroutine durchgeführt, bezeichnet
als OS_RET-Routine 300. Dies ist der gleiche Code, in den
der Wiederherstellungsprozess springt, nachdem er das Zielzustandsbild
wiederhergestellt hat. Von diesem Punkt an weiß der Code nicht wirklich,
ob das Zielzustandsbild nur gespeichert oder wiederhergestellt wurde.
Der Versatz von OS_RET wird in der CSS vom Registerwert CS:EIP gespeichert,
und der Wiederherstellungscode wird ihn aufnehmen und dorthin springen. OS_RET
schließt
die Zielzustands-Wiederherstellungsprozedur ab, und lädt im Falle
einer Speicherung die Werte der Register neu, die schon geladen sind.
Eine wichtige Angelegenheit ist das Annulieren und Löschen von
Cache und Verschiebungspufferspeichern (TLBs), die als Cache im
Paging-Mechanismus des Pentium verwendet werden, da der Wiederherstellungscode
gerade das Paging wiederangeschaltet hat und die TLBs in der CPU
ungültig
sind. Zunächst
werden die Segment-Register
zusammen mit den Stapel-Zeigern wiederhergestellt. Anschließend werden
IDTR, TR, CR2 und CR4 wiederhergestellt. Die Zielzustands-Wiederherstellungsprozedur benötigt das
Direktkorrigieren der Seitentabellen, und zu diesem Zeitpunkt werden
diese Korrekturen nicht mehr benötigt,
so dass die Seitentabellen aus den im CSS gespeicherten Werten wiederhergestellt werden.
Anschließend
werden die Festplattengeometrie-Einstellungen entsprechend den in
den lokalen Variablen gespeicherten Werten eingestellt. Der Speicher-
und der Wiederherstellungsprozesshaben keine IDE-Interrupts verwendet
und wurden auf dem Controller ausgeschaltet, so dass sie in diesem
Moment wiedereingeschaltet werden. Anschließend wird PIC in der gleichen
Art initialisiert, wie es das QNX während seines Startens macht.
Schließlich werden
die Masken der PIC- und CPU-Merker (flags) wiederhergestellt, um
das Vorkommen von Interrupts zu ermöglichen.
-
OS_RET
kehrt nun zum Aufrufer der Bildspeicherroutine, der alle allgemein
benutzten Register vom Stapel abhebt (pop) und von der ursprünglich für die Bildspeicherprozedur
ausgelösten
NMI, zurück.
Die Ausführung
ist nun zurück
beim Zielzustandsprozess-Code 99, der Zeitgeber wird mit
den während
des Speicherns erhaltenen Werten reinitialisiert, und das Dateisystem
wird wieder angeschaltet. Schließlich werden die Programme,
die in den Speicher in einem gehaltenen Zustand geladen wurden,
zum Ablauf zugelassen, um den Maustreiber zu reinitialisieren, den
Systemzeitgeber mit der Hardware-Uhr zu synchronisieren und die
Windows-GUI wiederherzustellen. Wenn eine Benutzeranwendung in der
Kommandozeile spezifiziert war, so wird diese erst nach dem vollständigen Laden
der Windows-GUI zum Starten zugelassen. Wenn die Bildspeicherroutine
dem Zielzustandsprozess anzeigt, dass mehr Daten gespeichert wurden
als das Bildspeichermedium zulässt,
werden die in den Speicher geladenen Prozesse nicht fortgeführt, sondern
stattdessen gelöscht
und die Fehlernachricht dargestellt.
-
Die
Zielzustands-Wiederherstellungsprozedur startet, indem das BIOS
die Steuerung an die Wiederherstellungsroutine übergibt, die sich im BIOS-Adressbereich
befindet. Da der Wiederherstellungsroutinen-Code die Benutzung von
RAM für
Datenpuffer und lokale Variablen benötigt, verschiebt er sich in
die Mitte des physikalischen RAM, da von QNX bekannt ist, diesen
Speicher nicht zu benutzen. Der Code ist daher neu angeordnet, und
das neue GDT wird eingerichtet. Es wird anschließend in den GDTR geladen, und
ab diesem Moment beruht der Code auf nichts anderem mehr ab als
auf seinen eigenen Einstellungen. Der Wiederherstellungscode reserviert
Platz für
die Puffer und den Stapel; DS, ES und SS sind normalerweise Code32-basiert,
aber werden sehr häufig
zu 0-basierten Schaltern. Wird die Festplatte als Bildspeichermedium
verwendet, wird die Datendatei angeordnet, indem die gleiche Funktion
wie während
der Bildspeicherprozedur verwendet, um den ersten Cluster der Datei
zu finden und diesen Wert in ein LBA zu konvertieren. Anschließend wird
das CSS in einen lokalen Puffer gelesen, da es die ersten 4 K der
Dateidaten besetzt und grundlegende Information darüber enthält, wie der
Rest der Daten zuzuordnen ist. Anschließend werden die Seiten eine
nach der anderen gelesen, und der Zeiger wird mit der im CSS gespeicherten Start/Stop-Liste
verglichen. Wird auf die Stopadresse gestoßen, wird Speicher mit 0 bis
zur nächsten
Startadresse gefüllt,
und der Prozess des Datenlesens aus der Datei wird wieder aufgenommen.
Mit spezieller Vorsicht wird vorgegangen, wenn Adressen nahe bei
der Ausführungsadresse
des Wiederherstellungscodes sind, indem die Speicheradresse zum Überspringen
des Wiederherstellungscode erhöht wird
und das Überschreiben
zu verhindern. Wird ein flash-ROM verwendet, wird seine Adresse
aus der PCI-Konfiguration abgerufen. Seitentabellen werden zu diesem
Zeitpunkt nicht verwendet, so dass die Linearadressen die gleichen
sind wie die physikalischen Adressen. Der flash-ROM wird nicht in
4 K-Seiten gelesen,
sondern in von den Start/Stopadressen abhängigen Blöcken. Wiederum werden die Adressen
zwischen Stop und Start mit 0 gefüllt, und der Bereich um den
Wiederherstellungscode erhalten.
-
Der
Sprung in den Betriebssystem-Rückkehr-Code
ist ein Befehl für
einen weiten Sprung am Ende des Wiederherstellungsroutinen-Codes.
Die Ziel-CS:EIP-Werte im Sprung-Befehls-OP-Code
werden mit im CSS gefundenen Werten geladen. Da QNX Paging verwendet,
und der Wiederherstellungscode dies nicht tut, muss der Befehl,
der Paging in CR0 ermöglicht,
und der folgende Sprungbefehl auf einer iden tisch abgebildeten Seite
abgelegt sein. Zu diesem Zweck wird das Seitenverzeichnis direktkorrigiert
(patched), um die Basis-Adresse des Wiederherstellungscodes so nachzuführen, dass
seine Linearadresse die gleiche sein wird wie seine physikalische
Adresse. Der ursprüngliche
Wert des Seitenverzeichnisses wird im CSS gespeichert. Zu bemerken ist,
dass dieses CSS die lokale Kopie des CSS des Wiederherstellungscodes
ist und nicht die, die sich im Datenbereich des QNX-Codes befindet.
Kritische Werte wie dieser werden später dorthin kopiert. Die Adresse
der CSS-Struktur wird aus der lokalen Kopie abgerufen und in das
Register EBX geladen. Zu diesem Zeitpunkt wird die gesamte Anzahl
wiederhergestellter Bytes in das CSS geladen wie auch die Adresse
des direktkorrigierten Seitenverzeichniseintrags und sein ursprünglicher
Wert. Der Sprung in den QNX-Code wird in zwei Schritten ausgeführt. Zunächst wird
das Paging angeschaltet, anschließend werden LDT und GDT in
die CPU-Register geladen, und dann wird der weite Sprung in den
QNX-Code gemacht. Von dort aus wird die Ausführung an der Adresse OS_RET
weitergeführt,
was der gleiche Ausführungspunkt
ist wie das Ende der Bildspeicherprozedur.
-
Auch
wenn die Erfindung in Verbindung mit der vorhergehenden speziellen
Ausführungsform
beschrieben wurde, sind viele Alternativen, Abwandlungen und Modifikationen
für den
Fachmann ersichtlich. Solche Alternativen, Abwandlungen und Modifikationen
fallen in den Bereich der folgenden beigefügten Ansprüche.