-
Gebiet
der Erfindung Die Erfindung betrifft das Gebiet der Prozessoren
in digitalen Datenverarbeitungsanlagen und bezieht sich insbesondere
auf einen Prozessor mit Ansprungbefehlen zur Überwachung des Kontrollflusses
bei der Abarbeitung von Programmen.
-
Stand
der Technik Prozessoren arbeiten Programme ab, indem sie Befehle
aus einem Speicher lesen und ausführen. Sie verfügen dazu über ein
besonderes Register, das Befehlszähler genannt wird. Im Befehlszähler wird
festgehalten, an welcher Position sich der Prozessor in der Abarbeitung
einer Befehlsfolge befindet. Abhängig
von der Implementierung wird diese Position als Adresse des derzeitigen oder
des nächsten
auszuführenden
Befehls ausgedrückt.
Handelt es sich bei einem Befehl nicht um einen Sprungbefehl, wird
während
seiner Ausführung die
Adresse im Befehlszähler
so verändert,
dass sie auf den jeweils nächsten
Befehl in der Befehlsfolge zeigt. Auf diese Weise werden Befehle
sequenziell verarbeitet.
-
Mit
Hilfe von Sprungbefehlen kann auf den Inhalt des Befehlszählers direkt
Einfluss genommen werden, um die Programmausführung an einer anderen Stelle
im Adressraum fortzusetzen. Es gibt unbedingte Sprünge, die
immer ausgeführt
werden, und bedingte Sprünge,
deren Ausführung
von einer Bedingung abhängig
ist. Für
den Aufruf von Unterprogrammen existieren Sprungbefehle, die den
aktuellen Inhalt des Befehlszählers
als Rücksprungadresse speichern.
Dadurch kann nach Beendigung eines Unterprogramms mit Hilfe eines
Rücksprungbefehls mit
der Programmausführung
hinter dem Aufruf des Unterprogramms fortgefahren werden. Rücksprungadressen
werden häufig
auf einem Stapel gespeichert.
-
Die
Methode zur Bildung der Adresse, an der die Programmausführung mit
Hilfe eines Sprungbefehls fortgesetzt wird, ist abhängig von
der Implementierung des Prozessors und des Sprungbefehls. In einer üblichen
Variante wird die gesamte Adresse oder ein Teil der Adresse in einem
Operanden des Sprungbefehls kodiert und ersetzt bei der Ausführung des
Sprungbefehls ganz oder teilweise den Inhalt des Befehlszählers. In
einer weiteren, häufig
bei bedingten Sprungbefehlen angewendeten Variante wird in einem
Operanden eine relative Adresse kodiert, die bei der Sprungausführung zum
aktuellen Inhalt des Befehlszählers
addiert wird. Im Allgemeinen unterstützen die Sprungbefehle in den
Befehlssätzen zeitgenössischer
Prozessoren auch andere Quellen für die Adressenangabe als die
Operanden der Befehle. Adressen können auch aus Registern und Speicherzellen
stammen und daher zur Laufzeit eines Programms berechnet oder aus
Tabellen gelesen werden.
-
Rücksprungbefehle
verwenden Adressen, die zuvor von Sprungbefehlen zum Aufruf von
Unterprogrammen oder infolge von Unterbrechungen gespeichert wurden.
-
Die
meisten Prozessoren bieten die Möglichkeit,
beim Eintreten von Ereignissen die laufende Programmausführung zu
unterbrechen und ereignisspezifische Behandlungsroutinen abzuarbeiten. Dazu
wird der aktuelle Inhalt des Befehlszählers in besonderen Registern
oder auf einem Stapel gespeichert und die Unterbrechungsvektor genannte
Adresse der entsprechenden Behandlungsroutine in den Befehlszähler geladen.
Nach Beendigung der Behandlungsroutine durch einen Rücksprungbefehl wird
die unterbrochene Programmausführung
fortgesetzt, indem der zuvor gespeicherte Inhalt des Befehlszählers wiederhergestellt
wird. Der Umfang der Unterbrechungsfähigkeit eines Prozessors ist
von der Implementierung seines Unterbrechungswerks abhängig. In
der Regel kann zwischen einer ganzen Reihe verschiedener Ereignisse
unterschieden und jedem Ereignis eine eigene Behandlungsroutine
zugeordnet werden.
-
Viele
Prozessoren sind mit einer Speicherverwaltungseinheit, einer Speicherschutzeinheit
oder einer Kombination aus beidem ausgestattet. Mit Hilfe einer
Speicherverwaltungseinheit können
mehrere Programme auf einem einzigen Prozessor in eigenen virtuellen
Adressräumen
ausgeführt
werden, indem die von den Programmen verwendeten virtuellen Adressen
in physikalische Adressen übersetzt
werden. Dies bietet neben der Möglichkeit,
für die
Programme eine transparente Hierarchie verschiedener Speicherarten
zu verwenden, den Vorteil, dass die Programme voneinander isoliert
werden können.
Ein Programm ist nicht in der Lage, auf die Daten eines anderen
Programms zuzugreifen, und es ist nicht möglich, durch einen Sprungbefehl
in einem Programm zu einem anderen Programm gehörende Befehle zur Ausführung zu
bringen. Innerhalb eines virtuellen Adressraums kann jedoch mit
einem Sprungbefehl die Programmausführung an einer beliebigen Adresse
fortgesetzt werden.
-
Mit
einer Speicherschutzeinheit kann der physikalische oder virtuelle
Adressraum, in dem ein Programm ausgeführt wird, in mehrere Abschnitte aufgeteilt
werden. Die Abschnitte können
mit unterschiedlichen Privilegien bezüglich des Zugriffs auf Daten
und der Ausführung
von Befehlen versehen werden. Beispielsweise kann ein Abschnitt
definiert werden, in dem Daten nur gelesen werden dürfen, während in
einem zweiten Abschnitt sowohl Lese- als auch Schreibzugriffe auf
die Daten erlaubt sind und nur die Daten in einem dritten Abschnitt
als Befehle interpretiert und ausgeführt können. Anzahl und Größe der Abschnitte sowie die vergebbaren Privilegien hängen von
der Implementierung der Speicherschutzeinheit ab.
-
Prozessorbefehle
werden in Form von Bitmustern codiert. Abhängig von der Implementierung eines
Prozessors haben diese Bitmuster feste oder variable Längen. Sie
enthalten den Operationscode und ggf. einen oder mehrere Operanden.
Der Operationscode definiert eindeutig, um welchen Befehl des Befehlssatzes
es sich handelt. Bei den meisten Prozessoren sind nicht allen möglichen
Kombinationen der Bits des Operationscodes Befehle zugeordnet, so
dass eine Anzahl illegaler Operationscodes existiert. Ältere Prozessoren
führen
Befehle mit illegalen Operationscodes entweder als Leerbefehle aus
oder zeigen ein undokumentiertes Verhalten. Neuere Prozessoren bieten
hingegen bei der Ausführung
von Befehlen mit illegalen Operationscodes die Möglichkeit einer Fehlerbehandlung.
-
Es
existieren verschiedene Verfahren zur Überwachung der ordnungsgemäßen Ausführung von
Programmen, die darauf beruhen, dass die Programme in regelmäßigen Abständen einem Überwachungsschaltkreis
ihre korrekte Funktion durch Meldungen anzeigen. Treffen diese Meldungen
innerhalb festgelegter Zeitschranken ein, wird die korrekte Funktion
des jeweiligen Programms angenommen. Bei Überschreitung der Zeitschranken
erfolgt eine Fehlerbehandlung.
-
Aus
US 2004/0088509 A1 ist
eine Mikroprozessorschaltung bekannt, mit deren Hilfe der Zugriff auf
Arbeits- und Programmdaten durch voneinander unabhängige Programme
organisiert werden kann. Der Speicher wird dazu in Bereiche aufgeteilt,
die zur Aufnahme der Programme dienen und denen Bitmuster zur Identifikation
und für
die Definition von Zugriffsrechten zugeordnet sind. Bei Speicherzugriffen werden
die Bitmuster der beteiligten Speicherbereiche von der Schaltung
ausgewertet, um die Zulässigkeit
der jeweiligen Operation zu ermitteln. Auf diese Weise ist ein geschützter Datenaustausch
zwischen den Programmen möglich,
ohne dass Ressourcen zur Steuerung durch ein Betriebssystem eingesetzt werden
müssten.
Desweiteren wird in
US 2004/0088509
A1 ein Mechanismus beschrieben, mit dessen Hilfe von einem
Programm bereitgestellte Funktionen von einem anderen Programm aus
nur an vorher festgelegten Einsprungadressen aufgerufen werden können. Dazu
wird bei jedem Funktionsaufruf das zur Identifikation verwendete
Bitmuster des Speicherbereichs, aus dem heraus der Aufruf erfolgt, mit
dem des Speicherbereichs verglichen, in dem die Funktion steht.
Sind die Bitmuster gleich, so ist der Sprung innerhalb eines einzigen
Speicherbereichs erfolgt und die Programmausführung wird normal fortgesetzt.
Besteht ein Unterschied, so muss der Sprung zwischen zwei Speicherbereichen
stattgefunden haben. In diesem Fall wird die Zieladresse daraufhin
untersucht, ob dort ein vorher vereinbartes und als Einsprungbefehl
(entry instruction) bezeichnetes Bitmuster hinterlegt ist. Nur wenn
dies der Fall ist, wird mit der Programmausführung fortgefahren; ansonsten
wird eine Fehlerbehandlung angestoßen.
-
Problem
Die geplante Abfolge der Befehle eines Programms kann mit einem
Kontrollflussgraphen beschrieben werden, in dem alle im Kontrollfluss
vorgesehenen Verzweigungen festgehalten sind. In einem fehlerfreien
Programm bewegt sich der Kontrollfluss entlang eines Pfads des Kontrollflussgraphen. Durch
während
des Entwurfs eines Programms gemachte oder zu seiner Laufzeit auftretende
Fehler kann sich der Kontrollfluss jedoch entlang eines neuen Pfads
bewegen, der nicht vorgesehen und im Kontrollflussgraphen nicht
enthalten ist. Dabei werden Befehle in einer unvorhergesehenen und
falschen Reihenfolge ausgeführt.
Ebenso können
Daten, in denen keine Befehle codiert sind, als Befehle interpretiert
und ausgeführt
werden. Auf Prozessoren, deren Befehle variable Längen haben
oder nicht an festen Adressgrenzen ausgerichtet sein müssen, können korrekte
Befehlsfolgen falsch interpretiert werden. Dies ist der Fall, wenn
mit der Ausführung
an einer Adresse begonnen wird, an der nicht der erste Teil eines
sich über
mehrere Speicherzellen erstreckenden Befehls gespeichert ist. Durch
diese Nichtbeachtung der Befehlsgrenzen können die Inhalte aufeinanderfolgender
Speicherzellen zu falschen Befehlen zusammengefasst werden.
-
Das
Auftreten der beschriebenen Fehlfunktionen ist möglich, weil mit Hilfe eines
Sprungbefehls die Programmausführung
an einer beliebigen Adresse fortgesetzt werden kann. Für den Prozessor
ist es unmöglich
zu erkennen, ob sich an einer angesprungenen Adresse tatsächlich ein
beim Entwurf vorgesehenes Sprungziel befindet. Der Prozessor muss
annehmen, dass es sich bei den ab der angesprungenen Adresse gespeicherten
Daten um korrekte Befehle handelt, und führt diese aus. Bei einem Sprung an
eine Adresse, an der sich kein vorgesehenes Sprungziel befindet,
kann daher keine geeignete Fehlerbehandlung durchgeführt werden.
Die gleiche Situation ergibt sich, wenn die Programmausführung durch
normales Inkrementieren des Befehlszählers an eine Adresse gelangt,
die zu erreichen nur durch einen Sprung vorgesehen ist. Auch diese
Abweichung vom geplanten Kontrollfluss kann vom Prozessor nicht
erkannt werden.
-
Nur
in Ausnahmefällen
bzw. unter besonderen Voraussetzungen kann das Vorliegen der beschriebenen
Fehlfunktionen unmittelbar oder nach einiger Zeit fehlerhafter Programmausführung erkannt
werden. Falls in einen Abschnitt des Adressraums gesprungen wird,
in dem die Speicherschutzeinrichtung eines Prozessors keine Programmausführung zulässt, kann
eine Fehlfunktion unmittelbar festgestellt werden. Das Gleiche gilt
für normales Voranschreiten
des Befehlszählers
an eine Adresse, die innerhalb eines solchen Speicherabschnitts
liegt. Enthält
einer der fälschlicherweise
ausgeführten
Befehle einen illegalen Operationscode und unterstützt der
betrachtete Prozessor die Erkennung von Befehlen mit illegalen Operationscodes,
wird eine Fehlfunktion nach Erreichen des Befehls bemerkt. Beim Einsatz
eines Überwachungsschaltkreises,
dem ablaufende Programme innerhalb festgelegter Zeitschranken durch
Meldungen ihre korrekte Funktion anzeigen müssen, wird eine Fehlfunktion
nach Überschreiten
dieser Zeitschranken bemerkt, falls die Meldungen wegen der Fehlfunktion
nicht mehr zeitgerecht erzeugt werden.
-
Für die vielfältigen Ursachen
solcher Fehlfunktionen seien im Folgenden einige Beispiele gegeben.
Bei einem Sprung an eine als Operand in einem Sprungbefehl codierte
Adresse kann es zur Ausführung
von Befehlen an einer unvorhergesehenen Stelle im Adressraum kommen,
wenn die Adresse vom Programmierer oder durch ein Programmierwerkzeug
falsch berechnet wurde. Es kann jedoch auch ein gerätetechnischer
Fehler vorliegen, wie beispielsweise ein Defekt eines Festwertspeichers.
Ein transienter Fehler beim Lesen der Operanden des Befehls aus
dem Speicher ist ebenfalls möglich.
Besteht ein Programm aus mehreren Teilen, die getrennt verändert wurden,
könnte
es zur Verschiebung des Sprungziels gekommen sein, ohne dass der Sprungbefehl
aktualisiert wurde. Bei einem Sprungbefehl mit relativer Adressangabe
führt auch
die Verschiebung des Sprungbefehls ohne Anpassung der relativen
Adressenangabe zu Sprüngen
an falsche Stellen im Adressraum. Werden einzelne Teile eines Programms
unabhängig
voneinander geladen, könnte
auch ein Sprung an eine korrekte Adresse zu einem Fehler führen, wenn
der anzuspringende Programmteil nicht geladen ist.
-
Häufig ist
es erforderlich, in Abhängigkeit
des Inhalts von Registern oder Speicherzellen verschiedene Programmabschnitte
anzuspringen. Ein solcher Verteiler kann durch Berechnung der Sprungadresse und
anschließendes
Springen realisiert werden. Diese Methode eignet sich besonders
für Programmabschnitte
mit gleicher Länge.
Bei einem allgemeineren Ansatz für
einen Verteiler wird die Sprungadresse aus einer Tabelle gelesen,
in der die Adressen der Programmabschnitte hinterlegt sind. In beiden Fällen kann
es zur Fortsetzung der Programmausführung an einer unvorhergesehenen
Adresse kommen, wenn die zur Auswahl des Programmabschnitts herangezogenen
Register oder Speicherzellen einen Wert annehmen, für den kein
Programmabschnitt existiert. Weitere Fehlerquellen bei der Realisierung von
Verteilern können
fehlerhafte Rechenvorschriften oder fehlerhafte oder unvollständige Tabellen sein.
Diese Fehler können
wiederum auf Programmierer, Programmierwerkzeuge oder gerätetechnische
und transiente Ausfälle
zurückzuführen sein.
-
Mit
einem Verteiler soll in der Regel nur einer unter verschiedenen
auswählbaren
Programmabschnitten zur Ausführung
gebracht werden. Am Ende jedes Programmabschnitts, ggf. mit einer
Ausnahme, müssen
daher Sprungbefehle stehen, mit denen die möglichen Verzweigungen des Kontrollflusses
wieder zusammengeführt
werden. Fehlen diese Sprungbefehle, werden fälschlicherweise Befehle ausgeführt, die
nach dem angesprungenen Programmabschnitt angeordnet sind und beispielsweise
zu einem anderen auswählbaren
Programmabschnitt gehören.
Eine ähnliche
Situation entsteht, wenn am Ende eines Unterprogramms oder einer
Unterbrechungsbehandlungsroutine der Rücksprungbefehl fehlt. Die Programmausführung wird
hinter dem Unterprogramm oder der Behandlungsroutine fortgesetzt
und es werden Befehle ausgeführt,
die in einem fehlerfreien Programm nur durch einen Sprung erreicht
werden können.
Fehlende Befehle können vom
Programmierer vergessen oder durch ein fehlerhaftes Programmierwerkzeug
nicht eingefügt
worden sein. Durch gerätetechnische
oder transiente Fehler kann das Bitmuster des Operationscodes eines
Befehls derart verändert
werden, dass statt des Rücksprungbefehls
ein anderer Befehl erkannt wird. Rücksprungbefehle setzen die
Programmausführung
an Adressen fort, die zuvor durch Sprungbefehle für den Aufruf
von Unterprogrammen oder infolge von Unterbrechungen gespeichert wurden.
-
Ist
eine gespeicherte Rücksprungadresse nicht
korrekt, dann kommt es bei der Ausführung eines Rücksprungbefehls
zu einem Sprung an eine unvorhergesehene Stelle im Adressraum. Eine
inkorrekte Rücksprungadresse
kann durch verschiedene Fehler verursacht werden. Wird ein Unterprogramm nicht
durch einen Sprungbefehl erreicht, der eine Rücksprungadresse speichert,
sondern durch einen gewöhnlichen
Sprungbefehl oder durch normales Voranschreiten des Befehlszählers, so
wird keine Rücksprungadresse
an dem dafür
vorgesehen Speicherort abgelegt. Die Ausführung eines Rücksprungbefehls
führt dennoch
dazu, dass dieser Speicherort gelesen und die dort gespeicherte
Adresse angesprungen wird. Es ist ebenfalls möglich, dass eine Rücksprungadresse
zwar korrekt gespeichert wurde, nachfolgende Operationen sie jedoch
unbeabsichtigt überschrieben
haben, bevor sie durch einen Rücksprungbefehl
gelesen wird. Darüber
hinaus werden in vielen Prozessoren Rücksprungadressen auf einem
Stapel gespeichert, der auch zur Zwischenspeicherung anderer Daten
verwendet wird. Es kann zu Fehlern kommen, wenn zwischen Speichern
und Lesen von Rücksprungadressen
ein Stapel derart unsymmetrisch benutzt wird, dass die Menge der
auf ihm abgelegten Daten nicht mit der Menge der von ihm heruntergenommen
Daten übereinstimmt.
In einem solchen Fall greift ein Rücksprungbefehl zum Lesen der
Rücksprungadresse
auf einen falschen Speicherort zu.
-
Damit
beim Eintreten eines Ereignisses die laufende Programmausführung unterbrochen
und eine Behandlungsroutine abgearbeitet werden kann, muss bei vielen
Prozessoren die Adresse der Behandlungsroutine an einer bestimmten
Stelle im Adressraum hinterlegt sein. Anschließend wird die Unterbrechungsbehandlung
für das
betreffende Ereignis aktiviert. Wenn versäumt wurde, die Adresse der
Behandlungsroutine zu hinterlegen, oder die angegebene Adresse falsch
ist, so wird beim Eintreten des Ereignisses an eine unvorhergesehene
Adresse gesprungen. Bei einer anderen Variante der Unterbrechungsbearbeitung
springt der Prozessor beim Eintreten eines Ereignisses, für das eine
Unterbrechungsbehandlung aktiviert ist, immer an eine feste, dem
Ereignis zugeordnete Adresse. An dieser Adresse muss entweder die
Behandlungsroutine selbst beginnen oder ein Sprungbefehl stehen,
der zur Behandlungsroutine verzweigt. Wenn dies nicht der Fall ist,
werden falsche Befehle ausgeführt.
-
Lösung Die
geschilderten Probleme werden erfindungsgemäß durch einen Prozessor nach
Anspruch 1 gelöst.
Der Befehlssatz des Prozessors enthält einen oder mehrere Ansprungbefehle.
Diese Ansprungbefehle bilden die Gegenstücke zu den Sprungbefehlen des
Prozessors, die genau genommen als Absprungbefehle betrachtet werden
können. Im
Befehlssatz des Prozessors ist jeder Ansprungbefehl einem oder mehreren
Sprungbefehlen als passend zugeordnet. In fehlerfreien Programmen
sind als Ziele von Sprungbefehlen nur Adressen erlaubt, an denen
pas sende Ansprungbefehle stehen. Ein Sprung an eine Adresse, an
der kein passender Ansprungbefehl steht, führt zu einem Fehlerzustand
des Prozessors. Verfügt
der Prozessor über
ein Unterbrechungswerk, können
Unterbrechungen hinsichtlich der Ansprungbefehle wie Sprungbefehle
behandelt werden. In fehlerfreien Programmen müssen Behandlungsroutinen für Unterbrechungen
mit passenden Ansprungbefehlen beginnen. Ein Aufruf einer Unterbrechungsbehandlungsroutine,
an deren Beginn kein passender Ansprungbefehl steht, führt zu einem
Fehlerzustand des Prozessors. Abhängig von der Art eines spezifischen
Ansprungbefehls kann dieser wie ein Leerbefehl ausgeführt werden
oder zu einem Fehlerzustand führen,
wenn die Adresse des Ansprungbefehls nicht durch einen Sprung, sondern durch
normales Voranschreiten des Befehlszählers erreicht wird. Die durch
An- oder Abwesenheit
von Ansprungbefehlen verursachten Fehlerzustände des Prozessors können Unterbrechungen
auslösen
oder den Prozessor zurücksetzen
oder anhalten.
-
Ausführungsbeispiele
In der einfachsten Form enthält
der Befehlssatz des Prozessors nur einen einzigen Ansprungbefehl.
Dieser ist allen Sprungbefehlen des Befehlssatzes als passend zugeordnet
und wird als Leerbefehl ausgeführt,
wenn er nicht durch einen Sprung, sondern durch normales Voranschreiten
des Befehlszählers
erreicht wird. Ein Sprung an eine Adresse, an der dieser Ansprungbefehl
nicht steht, hält
den Prozessor an.
-
In
einer sehr umfassenden Realisierung wird jedem einzelnen Sprungbefehl
im Befehlssatz des Prozessors jeweils ein Paar Ansprungbefehle gegenübergestellt
und als passend zugeordnet. Von den beiden Ansprungbefehlen eines
Paars wird jeweils einer als Leerbefehl ausgeführt, wenn er nicht durch einen
Sprung, sondern durch normales Voranschreiten des Befehlszählers erreicht
wird. Der andere Ansprungbefehl des Paares führt in der gleichen Situation
zu einem Fehlerzustand des Prozessors. Es kann zwischen vielen verschiedenen
durch An- oder Abwesenheit
von Ansprungbefehlen verursachten Fehlerzuständen unterschieden werden.
Jedem Sprungbefehl ist ein Fehlerzustand zugeordnet, den der Prozessor
annimmt, wenn an der angesprungenen Adresse kein passender Ansprungbefehl
steht. Den Ansprungbefehlen, die in fehlerfreien Programmen nicht
durch Sprünge,
sondern durch normales Voranschreiten des Befehlszählers erreicht
werden dürfen,
werden ebenfalls unterschiedliche Fehlerzustände zugeordnet. Die Fehlerzustände lösen Unterbrechungen
aus, wobei jeder Fehlerzustand die Ausführung einer spezifischen Behandlungsroutine
bewirken kann.
-
Ein
Kompromiss zwischen Sicherheit und Komplexität des Prozessors lässt sich
durch Einteilung der Sprungbefehle in Klassen erreichen. In einer möglichen
Implementierung werden alle gewöhnlichen
bedingten und unbedingten Sprungbefehle zu einer Klasse zusammengefasst
und alle Sprungbefehle zum Aufruf von Unterprogrammen zu einer zweiten
Klasse. Den Sprungbefehlen der ersten Klasse werden zwei Ansprungbefehle
als passend zugeordnet. Der erste Ansprungbefehl wird als Leerbefehl
ausgeführt,
wenn er nicht durch einen Sprung, sondern durch normales Voranschreiten
des Befehlszählers
erreicht wird. Der zweite Ansprungbefehl führt in der gleichen Situation
zu einem Fehlerzustand. Ein dritter Ansprungbefehl wird der zweiten Sprungbefehlsklasse
als passend zugeordnet. Seine Ausführung führt ebenfalls zu einem Fehlerzustand, wenn
er nicht durch einen Sprung erreicht wird. Auch die Ursachen der
Fehlerzustände
des Prozessors lassen sich gruppieren. In diesem Ausführungsbeispiel
sind zwei Fehlerzustände
denkbar. Der erste wird angenommen, wenn ein Sprungbefehl die Programmausführung an
einer Adresse fortsetzt, an der kein passender Ansprungbefehl steht.
Der zweite Fehlerzustand wird angenommen, wenn einer der beiden
Ansprungbefehle, die nur angesprungen werden dürfen, durch normales Voranschreiten
des Befehlszählers
erreicht wird. Die Fehlerzustände
können
wiederum durch Unterbrechungen behandelt werden.
-
Ob
ein auszuführender
Befehl durch normales Voranschreiten des Befehlszählers erreicht
wurde oder durch einen Sprungbefehl bzw. eine Unterbrechung, lässt sich
mit unterschiedlichen Verfahren erkennen. Bei der Ausführung eines
Befehls können
Informationen gespeichert werden, die bei der Ausführung des
nachfolgenden Befehls ausgewertet werden. In diesen Informationen
kann enthalten sein, ob ein Sprungbefehl ausgeführt wurde und ggf. um welchen
Sprungbefehl es sich handelte. Ebenso kann festgehalten werden,
ob eine Unterbrechung stattfand. Eine weitere Methode, die bei Prozessoren
mit fester Befehlslänge
angewendet werden kann, ist die Überwachung
des Befehlszählers.
Damit können auch
Sprünge
erkannt werden, die nicht durch Sprungbefehle oder Unterbrechungen
verursacht wurden, sondern durch unvorhergesehene Veränderungen
des Inhalts des Befehlszählers,
beispielsweise durch transiente Fehler.
-
Durch
die Erfindung erreichte Vorteile Mit der vorliegenden Erfindung
können
Abweichungen vom vorgesehenen Kontrollfluss eines Programms, die durch
fehlerhafte oder fehlende Sprungbefehle, fehlerhafte Unterbrechungsvektoren,
fehlende Behandlungsroutinen für
Unterbrechungen und weitere nicht vorgesehene Beeinflussungen des
Befehlszählers verursacht
wurden, bereits bei der Ausführung
des ersten falschen Befehls erkannt und behandelt werden. Im Gegensatz
dazu ist es nur in Ausnahmefällen bzw.
unter besonderen Voraussetzungen und häufig erst nach einiger Zeit
fehlerhafter Programmausführung
möglich,
die genannten Fehlfunktionen mit dem Stand der Technik entsprechender
Mittel zu erkennen.