-
Die
Erfindung betrifft einen Mikroprozessor mit mindestens einer Befehlsausführungseinheit
zum Ausführen
von Prozessorbefehlen und mindestens einem Registerspeicher im Registerblock
zum temporären
Zwischenspeichern von Datenworten.
-
Die
Erfindung betrifft weiterhin einen Compiler zum Erzeugen von Objekt-
und/oder Maschinencode zur Steuerung eines solchen Mikroprozessors.
In komplexen Systemen muss sichergestellt werden, dass ein Prozessor
keine an sich anderen Prozessen vorbehaltene Speicheradressen nutzt.
Zudem ist sicherzustellen, dass sich Variablen innerhalb vorgegebener
Grenzen halten.
-
Für die Speicherverwaltung
verfügen
herkömmliche
Prozessoren über
Speicherverwaltungseinheiten (Memory Management Units-MMU), die
gegebenenfalls auch eine Speicherschutzeinheit (Memory Protection Unit-MPU)
beinhaltet. Eine herkömmliche
Speicherschutzeinheit MPU bietet einen gewissen Zugriffschutz, indem
ein gemeinsam genutzter Speicher in seinem Adressbereich sehr grobkörnig in
Abschnitte eingeteilt wird. Für
diese Abschnitte werden Zugriffsrechte definiert und jeder fehlerhafte
Zugriff wird abgelehnt. In diesem Fall wird eine Ausnahmewarnung
erzeugt, die so genannte Exception. Die Ausnahme wird wiederum durch
ein besonderes Programm im kompletten Softwaresystem, die so genannte
Exception Service Routine, behandelt, so dass ein qualifiziertes
Fortlaufen des (fehlerhaften) Programms zumindest möglich ist.
-
Die
datenveränderlichen
Werte stammen bei Mikroprozessoren aus einem Speicher, dem so genannten
Hauptspeicher. Weiterhin werden Registervariablen, die unter anderem
durch Optimierungen eines Compilers entstehen können genutzt. Diese temporären Registervariablen,
deren Gültigkeitsbereich
beschränkt
ist werden ausschließlich
in einem der zentralen Register des Prozessors gehalten. Abgesehen
von den Registervariablen wird bei einem lesenden oder schreibenden
Zugriff auf die Datenwerte des Hauptspeichers oder gegebenenfalls
Cache-Speichers zugegriffen. Der Zugriff wird durch die Speicherverwaltungseinheit
MMU kontrolliert. Zum Zugriff auf die im Hauptspeicher oder Cache-Speicher
abgelegten Daten werden Zeiger benötigt, die die aktuelle Zugriffsadresse
der Daten im Speicher beinhalten. Diese Zeiger unterliegen keinerlei Kontrolle,
dass heißt
sie können
durch Veränderungen
auf Bereiche zeigen, die nicht mehr erlaubt sind, für die also
keine Zugriffsberechtigung mehr vorliegt.
-
Der
herkömmliche
MPU-Mechanismus gewährt
einen Zugriffsschutz zwischen verschiedenen Prozessen. Zwei verschiedene
Prozesse haben per Definition unterschiedliche Speicherbereiche,
so dass ein Zugriff eines Prozesses außerhalb des zugehörigen Speicherbereichs
sicher erkannt wird. Innerhalb eines Prozesses können fehlerhafte Zugriffe nur
in Ausnahmefällen
entdeckt werden, z. B. wenn ein Teil der Befehlssequenz fehlerhaft
als Daten interpretiert werden. Der MPU-Mechanismus ist damit sehr eingeschränkt. Die
herkömmlichen
Mechanismen bieten auch keine Überwachung
von Wertebereichen für
einzelne Daten, falls deren zulässiger
Bereich eingeschränkt
ist. Hierzu ist eine Softwareüberwachung
erforderlich, die zu einer drastischen Zunahme der Laufzeit führt.
-
Aus
der
DD 75162 ist eine
Schaltungsanordnung zur Durchführung
des Speicherschutzes für
einen in Blöcke
aufgeteilten Hauptspeicher einer Datenverarbeitungsanlage bekannt.
Damit soll gewährleistet
werden, dass Programme nicht auf Daten ei nes anderen Programms zugreifen
und diese verändern.
Hierzu wird die Blockadresse eines vorangehenden Speicherzugriffs
in ein Blockadressenregister aufgenommen. Jedem Block ist dabei
ein Speicherschlüsselregister
zugeordnet, das einen Speicherschlüssel enthält. Durch Vergleich des Speicherschlüssels mit
einem dem Programm zugeordneten Schutzschlüssel wird der Speicherzugriff
gesteuert. Wenn die Blockadressen des vorangehenden Speicherzugriffs
und des aktuellen Speicherzugriffs nicht mehr übereinstimmen, wird ein neuer
Speicherschlüssel
gelesen. Dadurch entfällt
ein ständiger
Zugriff auf das jedem Block zugeordnete Speicherschlüsselregister.
-
In
der
DE 41 15 152 C2 ist
ein kartenförmiger
Datenträger
mit einer Datenschützenden
Mikroprozessorschaltung zur Verhinderung des Zugriffs auf die im
Speicher abgelegten Daten beschrieben. Ein Komparator vergleicht
die Inhalte eines Adressregisters und eines Hilfsregisters, wobei
in dem Hilfsregister vorprogrammierte Adressen eines freigegebenen
oder zu schützenden
Speicherbereichs abgelegt sind. Die Zuordnung der zulässigen Adressräume erfolgt
bezogen auf das auszuführende
Programm.
-
In
der
EP 0 813 714 B1 ist
eine Mehrbenutzer-Datenverarbeitungsanlage mit Speicherschutz offenbart,
die eine Speicherbereichs-Zugriffstabelle in einem Betriebssystemspeicherbereich
hat. In der Speicherbereichs-Zugriffstabelle sind pro Anwenderspeicherbereich
der zugelassene Adressraum für
die im jeweiligen Anwenderspeicherbereich geladenen Befehle hinterlegt.
Vor einer Befehlsausführung
wird überprüft, ob der vom
jeweiligen Befehl angeforderte Zugriff auf eine Speicherzelle im
zugelassenen Adressraum liegt und gegebenenfalls die Ausführung des
Befehls gesperrt.
-
In
der
DE 1 952 158 A1 ist
ein Speicherschutzverfahren für
einen zu schützende
Informationen enthaltenen Speicher beschrieben, bei dem getrennt
von dem Speicher obere und untere Grenzwerte für zugängliche Speicheradressen gespeichert
werden. Ein Adressenteil einer Speicheradresse wird mit diesen Grenzwerten
verglichen, um den Speicher je nach Ergebnis des Vergleichs zu sperren
oder zugänglich
zu ma chen. Die oberen und unteren Grenzwerte werden in Abhängigkeit
von dem zu schützenden
Speicher von einer Peripherieverarbeitungseinheit (PPU) in Registern
abgelegt, während
unabhängig
davon Adressen von einer zentralen Prozessoreinheit (CPU) an einen
Adressbus gelegt werden.
-
Weiterhin
ist aus der
EP 0 011
685 B1 eine programmierbare Speicherschutzvorrichtung für Mikroprozessorsysteme
bekannt, bei der Speicherblöcken
zugeordnete oberen und unteren Grenzwerte in einem Grenzadressregister
abgelegt werden. Zur Überprüfung, ob
eine Speicheradresse zulässig
ist oder nicht, erfolgt ein Vergleich der auf einem Adressbus anliegenden
Adresse mit den im Grenzwertregister definierten Grenzwerten. Die
Speicherschutzmechanismen sind sehr eingeschränkt und bieten keine Überwachung
von Wertebereichen für
einzelne Daten, falls deren zulässiger
Bereich eingeschränkt
ist.
-
Aufgabe
der Erfindung ist es daher, einen verbesserten Prozessor zu schaffen,
mit dem die schnelle Überprüfung der
Gültigkeit
des Datenwortes in Abhängigkeit
von zugeordneten Zulässigkeitsgrenzwerten
und Kontrollwerten möglich
ist.
-
Die
Aufgabe wird mit dem Prozessor der eingangs genannten Art dadurch
gelöst,
dass mindestens ein Registerspeicher im Registerblock weiterhin
Speicherplatz zum Zwischenspeichern von für ein Datenwort jeweils festgelegten
Zulässigkeitsgrenzwerten
und eines Kontrollwortes hat, die zusammen mit dem Datenwort im
Registerspeicher zwischenspeicherbar sind, und dass die Befehlsausführungseinheit
vorgesehen ist, um in Abhängigkeit
von dem Kontrollwort eine Zulässigkeitsüberprüfung, ob
das Datenwort in dem durch die zugeordneten Zulässigkeitsgrenzwerte festgelegten
Bereich liegt, auszuführen.
-
Durch
die Erweiterung des zum temporären
Zwischenspeichern des Datenworts vorgesehenen Registerblocks um
Speicherplätze
für die
Zulässigkeitsgrenzwerte
und das Kontrollwort ist es nunmehr möglich, zusammen mit dem zu
einer Befehlsausführung
mit der Befehlsausführungseinheit
in den Registerspeicher geschriebenen Datenwort, das eine Speicheradresse
oder ein Operand sein kann, speziell für dieses Datenwort festgelegte
Grenzwerte vorzugeben und mit in den Registerspeicher einzuschreiben.
In Abhängigkeit
von dem Kontrollwort, das ebenfalls auf das Datenwort bezogen und
gleichfalls mit geladen ist, wird dann eine Überprüfung des Datenwortes durchgeführt, ob
dieses innerhalb der Grenzwerte liegt. Durch das Kontrollwort kann
z. B. festgelegt werden, ob eine Überprüfung stattfinden soll oder
nicht. Zudem kann die Methode der Überprüfung durch das Kontrollwort
steuerbar sein.
-
Ein
Registerblock im Sinne der vorliegenden Erfindung wird als Register-File
in der Gesamtheit aller Register verstanden. Ein Registerelement
aus einem Registerblock wird Registerspeicher genannt. Ein Registerspeicher
hat eine Anzahl von Registerteilen bzw. Registerbereichen, in denen
jeweils Datenworte abgelegt werden können. Die Registerteile eines
Registerspeichers enthalten nicht nur wie herkömmlich einen Datenregisterteil,
sondern zusätzlich
Grenzwertregisterteile für
den minimalen und maximalen Grenzwert und Kontrollwortregisterteile
für das
Kontrollwort.
-
Der
Prozessor ermöglicht
somit eine feinkörnige
und schnelle Überprüfung der
Gültigkeit
von Datenworten, ohne dass die Verarbeitungsgeschwindigkeit wesentlich
reduziert wird. Es sind lediglich nur die zusätzlichen Zulässigkeitsgrenzwerte
und das Kontrollwort zusammen mit dem Datenwort einzulesen und die
Befehlsausführungseinheit
muss die Überprüfung in
Abhängigkeit
von dem Kontrollwort vornehmen, dass heißt mindestens eine Auswertung
des Kontrollwortes vorsehen.
-
Das
Datenwort kann beispielsweise ein Adresszeiger auf eine Speicheradresse
eines Speichers sein, der adressspezifisch zu schützen ist.
Der Speicher kann ein von mehreren Peripheriegeräten gemeinsam genutzter (Haupt-)Speicher
oder aber auch ein prozessorbezogener Cache-Speicher oder ähnliches
sein.
-
Die
Zulässigkeitsgrenzwerte
legen beispielsweise obere und untere Grenzen eines für die Adressierung
mit dem Adresszeiger als Datenwort zugelassenen Speicherbereiches
fest.
-
Es
ist aber auch denkbar, dass das Datenwort ein Wert einer Variablen
ist. Dann legen die Zulässigkeitsgrenzwerte
die Wertebereichsgrenzen für
die Variable fest.
-
Auf
diese Weise kann beim Inkrementieren des Adresszeigers oder der
Variablen mit der Befehlsausführungseinheit
ständig überprüft werden,
ob der inkrementierte Adresszeiger oder die inkrementierte Variable noch
innerhalb der vorgegebenen Grenzen liegen.
-
Besonders
vorteilhaft ist es, wenn die Schaltungseinrichtung eine Befehlsanweisungs-Ladeeinheit zum
Lesen einzelner Befehlsanweisungen aus einem Befehlsroutinenspeicher,
in dem Objekt- und/oder Maschinencode in Form aufeinander folgender
Anweisungen abgelegt ist, und einer an die Befehls-Ladeeinheit angeschlossene
Decodier- und Ladeeinheit zum Decodieren der eingelesenen Befehlsanweisungen
und Steuern des Einladens von Operanden aus dem zugeordneten Registerspeicher
in die Decodier- und Ladeeinheit vorgesehen sind. Die Decodier-
und Ladeinheit hat dabei mit der Befehlsausführungseinheit verbundene Ausgänge.
-
Auf
diese Weise können
Anweisungen, vorzugsweise Maschinen-Code (hier in Assemblerschreibweise
dargestellt) sukzessiv eingelesen und zur Steuerung der Befehlsausführungseinheit
genutzt werden.
-
Ausgänge der
Decodier- und Ladeeinheit sind vorzugsweise mit einer Speicherzugriffseinheit
zur Zugriffsteuerung auf einen internen oder externen Datenspeicher
verbunden. Damit kann mit den im Registerspeicher abgelegten Adresszeigern
ein Zugriff auf den internen oder externen Datenspeicher erfolgen.
-
Die
Speicherzugriffseinheit ist zudem vorzugsweise mit einer Busschnittstelleneinheit
verbunden, so dass der Zugriff auf den Datenspeicher mit der Busschnittstelleneinheit über einen
Adress- und/oder Datenbus erfolgen kann.
-
Die
Zulässigkeitsüberprüfung der
in dem jeweiligen Registerspeicher abgelegten Datenworte erfolgt vorzugsweise
verborgen mit der Ausführungseinheit.
Hierzu sind Be fehlsanweisungen zum Auslesen von Datenworten zusammen
mit den zugeordneten Zulässigkeitsgrenzwerten
und dem Kontrollwort aus dem Speicher in die Registerspeicher bzw.
in die umgekehrte Richtung vorgesehen. Die Befehlsanweisungen sind
dabei so implementiert, dass sie im Falle einer Grenzwertüber- oder
-unterschreitung eine vordefinierte Fehlerbehandlungsroutine starten.
-
Das
Auslesen und die Ausführung
der Befehlsanweisungen werden dabei mit Hilfe der oben erwähnten Befehlsanweisungs-Ladeeinheit
und Decodier- und Ladeeinheit in Verbindung mit der Befehlsausführungseinheit
vorgenommen.
-
Der
Prozessor ist vorzugsweise so eingerichtet, dass die den Datenworten
zugeordneten Zulässigkeitsgrenzwerte
und Kontrollworte durch den Programmcode definierbar sind. Auf diese
Weise ist eine flexible Vorgabe der Zulässigkeitsgrenzwerte und Kontrollwerte
in Verbindung mit den zugeordneten Datenworten möglich, ohne dass diese beim
Start eines Programms relativ statisch vordefiniert in ein bei Ausführung des Programmcodes
unverändertes
Grenzwertregister gespeichert werden müssen. Vielmehr ist während der Laufzeit
des Programms eine ständige
Anpassung der Grenzwerte in Abhängigkeit
von dem jeweils zu überprüfenden Datenwort
möglich.
-
Besonders
vorteilhaft ist es, wenn die Befehlsausführungseinheit mindestens zwei
gesondert ansteuerbare Rechenwerke hat. Ein Rechenwerk ist dabei
exklusiv für
die Zulässigkeitsüberprüfung und
das mindestens andere Rechenwerk für die Ausführung von sonstigen Befehlsanweisungen
reserviert. Auf diese Weise kann die Zulässigkeitsüberprüfung transparent für das ausgeführte Programm
parallel zu anderen Aufgaben in der Prozessorhauptschleife, sozusagen
im Verborgenen ausgeführt
werden. Es ist lediglich eine zusätzliche Flusssteuerung für die Zulässigkeitsüberprüfung und
das Ein- und Auslesen der Zulässigkeitsgrenzwerte
und Kontrolldaten aus dem Registerspeicher erforderlich.
-
Der
Mikroprozessor ist vorzugsweise ein RISC-Prozessor (Reduced Instruction
Set Computer). Bei RISC-Prozessoren erfolgt der Speicherzugriff
auf Daten mit Hilfe von Lade- und Speicher-Datentransferbefehlen
(Load und Store). Speicherzugriffe und logisch/arithmetische Operationen
sind strikt voneinander getrennt, so dass während des Ein- und Ausladens
von Daten in/aus dem Registerspeicher die Befehlsausführungseinheit
nicht für
andere Operationen genutzt wird. Es ist daher ohne weitere Kollisionskontrolle
mit anderen Programmroutinen möglich,
die Load- und Store- und Datentransferbefehle um Routinen zur Zulässigkeitsüberprüfung zu
erweitern und hierfür
die während
des Speicherzugriffs exklusiv zur Verfügung stehende Ausführungseinheit
zu nutzen. Weiterhin gibt es nur einen Speicherzugriff für einen
Operanden zur jeweiligen Befehlsabarbeitungsfolge und dies auch
nur bei den Lade- und Speicher-Datentransferbefehlen, was die Speicherzugriffsberechnungen
begrenzt und vereinfacht.
-
Die
Aufgabe wird weiterhin mit dem Compiler der eingangs genannten Art
dadurch gelöst,
dass der Compiler zur Erzeugung von Objekten und/oder Maschinencode
eingerichtet ist, der Anweisungen zum Zwischenspeichern von Kontrollwerten
und Zulässigkeitsgrenzwerten
in Verbindung mit einem Datenwort in einem Registerspeicher enthält, so dass
bei Ausführung
des Objekt- und/oder Maschinencodes auf dem Mikroprozessor eine
temporäre
Zwischenspeicherung von einem Datenwort jeweils zugeordneten Zulässigkeitsgrenzwerten
und einem Kontrollwert in einem Registerspeicher zusammen mit dem
Datenwort und eine Zulässigkeitsüberprüfung des
Datenwortes in Abhängigkeit
von dem Kontrollwert auf Basis der Zulässigkeitsgrenzwerte erfolgt.
-
Damit
ist eine automatische Generierung von Zulässigkeitsüberwachungsanweisungen möglich, ohne dass
diese in einem Programmcode von einem Programmierer vorgegeben werden
müssen.
Die Zulässigkeitsüberprüfung findet
somit im Hintergrund statt.
-
Vorteilhafte
Ausführungsformen
sind in den Unteransprüchen
beschrieben.
-
Die
Erfindung wird nachfolgend anhand von Ausführungsbeispielen mit den beigefügten Zeichnungen näher erläutert. Es
zeigen:
-
1 – Blockdiagramm
von wesentlichen Teilen einer RISC-Prozessorarchitektur mit vier-stufigen Phasenpipelining;
-
2 – Flussdiagramm
einer typischen Programmcode-Hauptschleife mit Teilphasen und zusätzlichem
Kontrolldatenfluss zur Grenzwertüberprüfung;
-
3 – Skizze
von Speicherbereichen eines herkömmlichen
Registerspeichers im Vergleich zu dem erfindungsgemäß erweiterten
Registerspeicher;
-
4 – Skizze
des Bezugs eines grenzwertüberwachten
Adresszeigers auf Bereiche eines Hauptspeichers;
-
5 – Skizze
des Bezugs einer grenzwertüberwachten
Variablen auf einen Zahlenwertebereich und ein erlaubtes Intervall.
-
Die 1 lässt ein
Blockdiagramm der für
die vorliegende Erfindung wesentlichen Teil eines RISC-Prozessors
erkennen, der einen Registerblock RF (Register File) mit einer Anzahl
von Registerspeichern hat. Mit Hilfe von Lade- und Speicher-Datentransferbefehlen
werden Operanden in einen jeden Registerspeicher im Registerblock
RF geladen. Erfindungsgemäß ist der
Registerblock RF dahingehend erweitert, dass zusammen mit dem Operanden,
dass heißt
dem geladenen Datenwort, zugeordnete Zulässigkeitsgrenzwerte und ein
Kontrollwert in einen jeden Registerspeicher RF eingeladen werden
können.
-
Ausgeführte logische
und arithmetische Befehle beziehen sich ausschließlich auf
die Datenworte, dass heißt
die bereits in den internen Registerblock RF eingeladene Operanden.
-
Auf
diese Weise können
alle möglichen
Operationen durchgeführt
werden, im Zweifels durch einen Ladebefehl gefolgt von der gewünschten
Operation. Durch die Load/Store-Architektur wird eine gleichmäßige Auslastung
der Pipelinestufen bei unterschiedlichen Befehlen erreicht.
-
Der
RISC-Prozessor hat weiterhin eine Befehlsanweisungs-Ladeeinheit
IF (Instruction Fetch), mit der die nächste anstehende Instruktion
aus einem Programmcode-Speicher
(nicht dargestellt) geholt wird. Die Befehlsanweisung wird dann
an eine Decodier- und Ladeeinheit DL (Decode/Load-Unit) weitergeleitet.
Hier werden die Befehlsanweisungen endgültig decodiert und die Datenworte
als Operanden aus dem Registerblock RF oder eines aus dem Speicher
geladen. Die Operanden können
Daten sein, die beispielsweise miteinander addiert werden sollen,
es können
aber auch Adresszeiger auf die Daten in einem Speicher sein, also
die Adresse der zu verarbeitenden Variablen.
-
Die
decodierte Instruktion wird mitsamt den Operanden anschließend an
eine Befehlsausführungseinheit
EX (Execute-Unit) weitergeleitet, die in der Regel eine arithmetische
Logikeinheit ALU und eine Speicherzugriffskontroll-Recheneinheit
MA (Memory Access) hat. Hier findet die eigentliche Operation statt,
deren Ergebnisse an eine Rückschreibeeinheit
WB (Write-Back-Unit) weitergegeben werden. Gegebenfalls werden solche
Ergebnisse auch an den Eingang der Befehlsausführungseinheit EX, d. h. den
Eingang der arithmetischen Logikeinheit ALU oder der Speicherzugriffskontroll-Recheneinheit
MA, und gegebenenfalls an weiter davor liegende Einheiten zurückgeleitet.
Dies wird auch als "Data-Forwarding" bezeichnet. Die
Rückschreibeeinheit
WB schreibt dann die Operationsergebnisse in den Registerblock RF
zurück.
Jede der Einheiten IF, DL, EX (ALU, MA) und WB benötigen im
angestrebten Idealfall einen Takt zur Ausführung. Die Parallelität der Elemente
der Befehlsausführungseinheit
EX, d. h. der arithmetischen Logikeinheit ALU und Speicher zugriffskontroll-Recheneinheit
MA ist einhaltbar, da Speicherzugriffe und logische/arithmetische
Operationen strikt von einander getrennt sind. Dies führt zu einer
verkürzten,
balancierten Pipeline.
-
Ein
Speicherzugriff Lade- oder Speicherbefehl läuft wie folgt ab:
Nach
dem Einladen einer Befehlsanweisung mit der Befehlsanweisungs-Ladeeinheit
IF werden die Operanden in die Decodier- und Ladeeinheit DL geladen.
Die Operanden sind die Speicheradresse bei Lade- und Speicher-Befehlen
sowie ein neuer Speicherinhalt bei einem (schreibenden) Speicherbefehl.
Falls die Speicheradresse in einem Registerspeicher des Registerblocks
RF steht, wird dies auch Registerindirekte Adressierung genannt.
Es erfolgt also eine Speicher-indirekte Adressierung durch direkte
Registerangabe.
-
Diese
Register-indirekte Adressierung ist in allen RISC-Architekturen
vorhanden, da sie optimal hierfür passend
ist. Mit Hilfe dieser Adressierung können alle Speicheradressen
erreicht werden (dies ist in RISC-Architekturen mittels einer Speicher-direkten
Adressangabe nicht möglich)
und alle weiteren Operationen, wie Inkrement, Offset etc. können ebenfalls
einfach durchgeführt
werden. Eine RISC-Architektur, die als Load/Store-Architektur ausgeführt ist,
benötigt
somit nur diese Register-indirekte Adressierung als Speicherzugriffsadressierung,
bzw. ein Compiler braucht nur diese zu nutzen. Dies gilt auch für abgeleitete
Adressierungsformen, wie Register-indirekte Adressierung mit Index,
Offset etc..
-
Ein üblicher
Prozessor hat aufgrund der verwendeten Digitaltechnik Register,
die je nach Bitbreite n von 0 bis (2n) – 1 reichen,
also beispielsweise bei einem 32-Bit Prozessor von 0 bis 0FFFFFFFFhex. Dies ist in der Regel ein singulärer Wertespeicher.
-
In
einem Kontrollmechanismus, der zwischen erlaubten und unerlaubten
Werten unterscheiden können
soll, werden zusätzliche
Angaben benötigt.
Diese werden bei der erfindungsgemäßen Schaltungsanordnung in
zusätzlichen
Bits neben dem Registerteil (Registerbereich) für das Datenwort bzw. den Operanden
gespeichert und somit gleichzeitig damit untrennbar verbunden. Die
Registerspeicher im Registerblock RF enthalten somit neben dem Registerteil
für das
Datenwort auch Registerteile für
die Zulässigkeitsgrenzwerte
sowie ein Kontrollwort. Vorzugsweise werden alle relevanten Register
eines Prozessors entsprechend erweitert, so dass nicht nur ein einzelnes
Register oder ein Pufferregister, sondern jedes Adress- und Universalregister Erweiterungsplätze für Zulässigkeitsgrenzwerte
und das Kontrollwort erhält.
Für die
Erweiterung wird die Menge an Speicherbits erheblich vergrößert und
zwar um das Vielfache der intrinsischen Daten- bzw. Adressbreiten.
Bei einer typischen 32-Bit Architektur werden jeweils 4 × 32 Bit
= 128 Bit im Registerspeicher abgelegt.
-
Es
handelt sich aber nicht um ein 128 Bit Register oder eine 128 Bit
Architektur im üblichen
Sinne, sondern um ein 4 × 32
Bit Registerüberwachungsset
mit bestimmten Teilaufgaben. Die zusätzlichen drei Datenworte, dass
heißt
der obere und untere Grenzwert als Zulässigkeitsgrenzwert und das
Kontrollwort dienen der unsichtbaren Überwachung des im Registerspeicher
abgelegten zugeordneten Datenwortes und nicht den eigentlichen Rechen-
oder Datenstrukturoperationen, die weiterhin mit dem einen ursprünglichen
Datenwort des Registerspeichers erfolgen. Mit Hilfe der zusätzlich gespeicherten
Zulässigkeitsgrenzwerte
und des Kontrollwertes wird eine Zulässigkeitsüberprüfung mit dem Ziel der Verhinderung
der Einstellung bzw. der Benutzung von unerlaubten Werten durchgeführt. Hierzu
wird ein eingeschränkter
Bereich durch zwei Grenzwerte, nämlich
den oberen und unteren Grenzwert aufgestellt. Nur ein Wert innerhalb
dieses erlaubten Bereiches ist ein erlaubter Wert. Ein Wert außerhalb
ist ein unerlaubter Wert und wird gesondert behandelt. Die Negation dieser Überwachung
liefert die viel stärkere
Aussage, dass kein Zugriff auf unerlaubte Bereiche mehr möglich ist.
-
Die
Zulässigkeitsüberwachungsfunktionalität der Schaltungsanordnung
ist eine Kontrolleinheit, die aus demselben Programmstrom gespeist
wird, wie die zur Verarbeitung der Datenworte genutzten Teile des Prozessors.
Der Hauptprogrammstrom wird mit einem eingebetteten Kontrollprogrammstrom
automatisch, permanent und transparent kontrolliert.
-
Die 2 lässt ein
Flussdiagramm einer Programmhauptschleife mit Teilphasen und einem
zusätzlichen
Zulässigkeitsüberprüfungs-Kontrolldatenfluss
erkennen.
-
Nach
dem Abholen eines Befehls mit der Befehlsanweisungs-Ladeeinheit
IF und der Decodierung des Befehls der Decodier- und Ladeeinheit
DL werden in der Hauptschleife unter Umständen Sprungbefehle oder ähnliches
auf neue Programmroutinen ausgeführt.
Mit der Decodierung eines Befehls und der Benutzung eines Registeroperanden
werden zudem Kontrolldaten aus dem Registerspeicher im Registerblock
RF geladen, nämlich
die oberen und unteren Grenzwerte und das Kontrollwort, die dem
im Registerspeicher abgelegten Datenwort zugeordnet sind.
-
In
der Hauptschleife werden von der Decodier- und Ladeeinheit DL dann
die Operanden aus dem Registerspeicher im Registerblock RF geholt.
Anschließend
werden die Befehlsanweisungen ausgeführt.
-
Zur
Zulässigkeitsüberprüfung erfolgt
zudem ein Auslesen der Kontrolldaten aus dem Registerspeicher, dass
heißt
der dem Operanden (Datenwort) im Register zugeordneten Zulässigkeitsgrenzwert
und des Kontrollwortes. In Abhängigkeit
von dem Kontrollwort findet dann eine Grenzwertüberprüfung (insbesondere eine Schreibkontrolle)
statt. Das Kontrollwort steuert hierbei, ob eine Zulässigkeitsüberprüfung stattfinden
soll oder nicht und gegebenenfalls ob eine Adressbereichsüberprüfung eines
Adresszeigers oder eine Wertebereichsüberprüfung einer Variablen durchgeführt werden
soll.
-
Für den Fall,
dass das Ergebnis der Zulässigkeitsüberprüfung negativ
ist, dass heißt
das der Adresszeiger oder das Datenwort der Variablen den vorgegebenen
Bereich über-
oder unterschreitet, wird eine Sonderbehandlungsroutine eingeleitet.
-
In
der Hauptschleife wird ansonsten das Ergebnis in die Rückschreibeeinheit
WB, die Befehlsausführungseinheit
EX, die Befehlsanweisungs-Ladeeinheit IF u. ä. zurück geschrieben und der nächste Schritt
des Programmablaufs gestartet. Es beginnt damit eine neue Runde
der Hauptschleife.
-
Die 3 lässt eine
Skizze des Inhalts des Registerspeichers im Registerblock RF erkennen.
-
In
einem herkömmlichen
Registerspeicher kann ein einziger Operand als binärer Wert
abgelegt werden. Dieser binäre
Wert stellt eine Variable dar, die je nach Bitbreite n Werte von
0 bis (2n)-1 annehmen kann. Dies gilt sowohl
für einfache
Zahlen wie für
Adresswerte als auch prinzipiell für alle Zahlenformate. Herkömmlicherweise
enthält
ein Registerspeicher diesen Wert als singulären Wert.
-
Zusätzlich zu
dem Registerteil für
die Variable (Datenwort) sind Registerteile für einen unteren und oberen
Grenzwert als Zulässigkeitsgrenzwerte
und für
ein Kontrollwort in dem Registerspeicher vorgesehen. Im Programmablauf
laufen die Berechnungen des funktionalen Programmcodes aus dem Hauptstrom
nur mit dem eigentlichen Registerdatenwortteil ab und der resultierende
Datenwert bleibt immer in dem als Register bezeichneten Teil des
Registerspeichers im Registerblock RF.
-
Im
Registerteil "Minimum" ist die untere Grenze
gespeichert. Dieser Basiswert stellt den untersten erlaubten Wert
der im Bereich "Register" abgelegten Variablen
dar. Darunter bzw. davor darf dieser Wert nicht sinken. Es handelt
sich somit im Wesentlichen um eine Zusatzkonstante zur Datendeklaration.
Im Registerteil "Maximum" des Registerspeichers
ist dementsprechend die obere Grenze gespeichert. Dieser Grenzwert
stellt den höchsten
erlaubten Wert dar. Darüber
bzw. danach darf dieser Wert nicht ansteigen. Dies ist im Wesentlichen
ebenfalls eine Zusatzkonstante zur Datendeklaration.
-
Das
Kontrollwort Control besteht aus einer Codierung für mehrere
statische und dynamische Typbeschreibungen. So muss im Wesentlichen
in einem Bit vermerkt werden, dass es sich um einen mit einem bestimmten
Datenladebefehl geladenen und hinsichtlich einer Grenzwertüber- oder
-unterschreitung zur kontrollierenden Wert handelt oder nicht. Die
Registerspeicher und speziell die Datenwertteile müssen auch
noch für andere
Verwendungen und Berechnungen, die der Zulässigkeitsüberwachung nicht genügen, zu
verwenden sein. Das Kontrollwort dient wachung nicht genügen, zu
verwenden sein. Das Kontrollwort dient daher zur Einsteuerung des Überwachungsmechanismus.
-
Die
vorzunehmende Zulässigkeitsüberprüfung funktioniert
nach einer einfachen Abfrage, die in der Syntax der Programmiersprache
C wie folgt dargestellt werden kann:
if (Register<Minimum || Register>Maximum) {exception(DPE_FAILURE);}
-
Die
Funktion "exception" steht hier für den üblichen
Exception-Mechanismus eines Prozessors, der die normale Bearbeitung
abbricht und eine Sonderbehandlung über eine vereinbarte Routine
einleitet. Im vorliegenden Fall der Grenzwertüberprüfung ist dies eine Reaktion
auf einen aufgetretenen falschen Wert.
-
Die 4 lässt eine
schematische Darstellung des Einsatzes der Zulässigkeitsüberwachung in der Adresskontrolle
erkennen. Mit der Zulässigkeitsüberwachung
werden Zeigeradressen auf Einhaltung von erlaubten Adressbereichen überprüft. Das
wirksame Schutzelement ist der überwachte
Adresszeiger, der die Adresse enthält, die im Bereich "Register" des Registerspeichers
im Registerblock RF (siehe 3) abgelegt ist.
Die Berechnungen und der resultierende Adresszeigerwert laufen nur
mit diesem Teil ab. Die Adresse darf sich innerhalb der oberen und
unteren Grenzwerte "Base" und "Limit" bewegen, aber nicht
darüber
hinaus. Ein Speicherzugriff mit einem falschen Adresswert führt zur
Ausnahmeroutine (Exception).
-
Der
Bereich "Base" des Registerspeichers
enthält
den Basiswert und stellt damit den untersten erlaubten Wert für die Adresse
und den Anfang des Datenobjektes dar. Darunter bzw. davor darf diese
nicht sinken. Der Bereich "Limit" des Registerspeichers
enthält
den Grenzwert bzw. das Ende des Datenobjektes und stellt somit den
höchsten
erlaubten Wert für
die Adresse dar. Darüber
bzw. danach darf diese nicht ansteigen.
-
Das
Kontrollwort Control dient der Feinsteuerung des Überwachungsmechanismus
und aktiviert hier vor allem die Adresskontrolle. In dem Kontrollwort
ist unter anderem codiert, dass es sich um einen Adresszeiger (Pointer)
handelt, so dass die entsprechende auf die Adresszeigerprüfung spezialisierte
Kontrolle durchgeführt
werden kann.
-
Der
Adresszeiger definiert zusammen mit den unteren und oberen Grenzwerten
(Base und Limit) ein Speicherblockobjekt, der einen bestimmten Datenbereich
im Hauptspeicher des Prozessors darstellt. Das Speicherblockobjekt
ist durch seine Anfangsadresse und seine Länge bzw. äquivalent durch die sich daraus ergebende
Endadresse charakterisiert. Um sicherzustellen, dass nur in diesem
Speicherbereich gearbeitet wird und nur dort Daten gelesen, verändert oder
geschrieben werden, wird die Zulässigkeitsüberprüfung durchgeführt. Die
Speicherbereiche werden durch Datendeklarationen in einem Programmquellcode
gebildet oder werden vom Compiler dynamisch angefordert und bilden
bestimmte Arbeitsbereiche. Die Grenzwertüberwachung sorgt nun dafür, dass
alle Zugriffe im gerade anstehenden Programmablauf auch nur in diesem
Arbeitsbereich bleiben und nicht versehentlich an andere Stellen
im Speicher gelangen.
-
Der
Hauptspeicher eines Prozessors, auch als Arbeitsspeicher bezeichnet,
ist üblicherweise
als Random Access Memory (RAM) ausgeführt und erlaubt einen wahlfreien
Zugriff auf eine jede Speicherstelle. Dies ist eine Voraussetzung
für frei
einstellbare Adresszeiger. Je nach verwendeter Bitbreite n spannt
dies einen Wertebereich von 0 bis (2n)-1
auf. Dafür
stehen z. B. für
einen 32-Bit-Prozessor die unterste Adresse 0 und die oberste Adresse
0FFFFFFFFhex.
-
Die
vorzunehmende Zulässigkeitsüberprüfung funktioniert
nach einer einfachen Abfrage, die in der Syntax der Programmiersprache
C wie folgt lautet:
if (Adresse<Base || Adresse>Limit) {exception(DPE_FAILURE);}.
-
Die
Funktion "exception" steht hierbei für den üblichen
Ausnahmemechanismus eines Prozessors, der die normale Abarbeitung
abbricht und eine Sonderbehandlung einleitet. In diesem Falle ist
dies eine Reaktion auf einen falschen aufgetretenen Wert für die Adresszeiger.
-
Die
Befehlsroutine für
die Zulässigkeitsüberprüfung kann
transparent für
das ausgeführte
Programm parallel zu anderen Aufgaben in der Prozessorhauptschleife
ausgeführt
werden. Diese Erweiterung bedingt dann unter anderem auch ein zusätzliches
Rechenwerk und eine zusätzliche
Flusssteuerung für
die Zulässigkeitsüberprüfung, wobei
bei einem RISC-Prozessor wie ausgeführt prinzipiell auch das ALU-Rechenwerk mitverwendet
werden kann. Die Zulässigkeitsüberprüfung wird
durch das Kontrollwort Control gesteuert.
-
Die
Adresskontrolle wird beispielhaft anhand der folgenden Syntax in
der Programmiersprache C erläutert:
-
Die
Speicherbelegung und der Link-Vorgang liefert z. B. die Startadresse
04000000hex für die Variable "buffer". Die Größe dieses
Datenobjektes beträgt
256 Bytes laut Deklaration. Bei einem Zugriff wird z. B. das Adressregister
A01 geladen mit:
Adresse = 04000000hex
Base
= 04000000hex
Limit = 040000FFhex
Control = 100hex,
z. B. zum Einschalten der Grenzwertüberwachung für Adressen.
-
Eine
Schleife die hochzählt
und alle Zeichen verwendet, verändert
auch die effektive Adresse in diesem Array-Zugriff. Falls z. B.
der Parameter "Länge" größer als
256 ist, was in der Praxis als Fehler oft vorkommt, würde beim Überschreiten
des Index 255 (auf->256)
und der Adresse 040000FF
hex ein unerlaubtes
Datenbyte an der Stelle 04000100
hex beschrieben
werden. Die Zulässigkeitsüberwachung
löst genau
davor eine "exception" aus und verhindert
dies. Die Übersetzung
des Beispiels in C-Syntax in Assembler Code sieht beispielsweise
wie folgt aus. Die speziellen Befehle sind fett gekennzeichnet:
-
Die 5 lässt eine
Skizze des Bezugs von Variablen mit zugeordneten Zulässigkeitsgrenzwerten
in Form oberer und unterer Grenzwerte und einem Kontrollwert zu
einem Zahlenwertebereich erkennen. Mit der Schaltungsanordnung können nämlich auch
alle Variablen gegen bestimmte Grenzen kontrolliert werden. In den
meisten Anwendungsgebieten ist nämlich
nur eine bestimmte Wertemenge aus der prinzipiell darstellbaren
Wertemenge zulässig.
-
Das
wirksame Schutzelement ist wieder der um die Zulässigkeitsgrenzwerte und das
Kontrollwort erweiterte Registerspeicher (3).
-
Die
Berechnungen und der resultierende Datenwert erfolgen nur mit den
im Bereich "Variable" des Registerspeichers
im Registerblock RF abgelegten Datenworten. Die Variable darf sich
innerhalb der beiden Grenzwerte "unteren
Grenze" und "obere Grenze" bewegen, aber in
keine Richtung darüber
hinaus.
-
Eine
Benutzung mit einem falschen variablen Wert führt zur Ausnahmefunktion (exception).
-
Die
untere Grenze stellt den untersten erlaubten Wert für die Variable
dar. Darunter darf diese nicht sinken. Die obere Grenze stellt den
höchsten
erlaubten Wert für
die Variable dar. Darüber
hinaus darf diese nicht ansteigen.
-
Das
Kontrollwort Control dient der Feinsteuerung des Überwachungsmechanismus
und aktiviert vor allem die Grenzwertüberprüfung, d. h. die Wertebereichskontrolle.
-
Das
erlaubte Intervall ist ein bestimmter Wertebereich im Zahlenbereich
des Prozessors, der durch seine untere Grenze charakterisiert ist.
In vielen Fällen
geht es darum nur in diesem erlaubten Intervall zu arbeiten und
alle Veränderungen
der Variable sicher in diesem Wertebereich zu halten. Die Wertebereiche
werden durch Datendeklarationen in einem Programmquellcode gebildet.
Der Prozessor sorgt nun dafür,
dass alle Berechnungen im gerade anstehenden Programmablauf auch
nur in diesem Wertebereich bleiben und nicht versehentlich ungültige Werte
annehmen können,
indem jeder Verstoß gemeldet
wird.
-
Der
Zahlenwertebereich ist der Wertebereich aller Zahlen und hängt von
der verwendeten Bitbreite ab. Bei einer verwendeten Bitbreite n
spannt dies einen Wertebereich von 0 bis (2n)-1
auf. Dafür
stehen z. B. für ein
32-Bit Prozessor die Ganzzahlen (Integer) 0 bis FFFFFFFFhex. Bei jeglichen anderen Zahlenformaten,
wie z. B. Fließkommazahlen
(Float) sind die Werte entsprechend dem Minimum/Maximum angepasst.
-
Die
Zulässigkeitsüberprüfung zur
Wertebereichskontrolle erfolgt mit einer einfachen Abfrage die in
der Syntax der Programmiersprache C wie folgt formuliert werden
kann:
if (Variable<Untere_Grenze
|| Variable>Obere_Grenze)
{exception(DPE_FAILURE);}
-
Die
Funktion "exception" steht wiederum für den üblichen
Ausnahmemechanismus eines Prozessors, der die normale Abarbeitung
abbricht und eine Sonderbehandlung einleitet, in diesem Falle eine
Reaktion auf einen falschen aufgetretenen Wert der Variablen.
-
Die
Zulässigkeitsüberprüfung von
Wertebereichen wird beispielhaft mit der nachfolgenden Syntax in der
Programmiersprache C erläutert.
-
-
Die
Variable "regler" wird durch die Pragma-
Anweisung zu einer überprüften Variablen
mit Rahmenkonstanten deklariert. Dabei werden die Konstanten gleich
mit definiert. Bei einem Zugriff wird z. B. das Datenregister D01
mit einer Wertekopie wie folgt geladen:
Variable = 20
Untere_Grenze
= 10
Obere_Grenze = 10000
Control Wert = 200hex,
zum
Beispiel zum Einschalten als Grenzwertüberprüfung für Variablen.
-
Die
angegebene Funktion wird dauernd aufgerufen und bewirkt eine Veränderung
an der Variablen "regler". Wenn beispielsweise
angenommen wird, dass die Funktion zwei Mal mit einem cmd=2 aufgerufen wird,
wird 2 × 8
vom Initialwert 20 abgezogen. Daraus ergibt sich die Wertfolge:
20 -> 12 -> 4. Der Wert 4 ist aber
nicht mehr erlaubt, da er kleiner als die untere Grenze ist. Es
wird daher eine Ausnahmeroutine (exception) ausgelöst.
-
Die Übersetzung
des C-Beispiels in Assembler-Code sieht beispielsweise wie folgt
aus:
-
Die
speziellen Befehle sind fett gekennzeichnet.
-
Die
Zulässigkeitsüberprüfung von
Variablen kann vorteilhaft in sicherheitskritischen Anwendungen eingesetzt
werden. So ermöglicht
der Prozessor eine wichtige Kontrolle, die inhärent ohne Weiteres auf Sicherungsanweisungen
funktioniert. Der Prozessor kann beispielsweise für eine Flugzeugturbine
genutzt werden, die im Flug nicht ausgeschaltet werden darf.
-
Die
für die
Zulässigkeitsüberwachung
genutzten Operanden sind neue Datentypen. Daher werden für die Darstellung
der neuen Operanden Codierungen im Maschinencode benötigt. Auch
die Darstellung im Assembler-Code ist etwas aufwendiger als die
bisherigen monolithischen Wertebyte (8-Bit), Word (16-Bit), DWord
(32-Bit) oder QWord (64-Bit), da der Operand selber eine ganze Struktur
an Teilwerten besitzt und diese aus Gründen der Lesbarkeit einzeln
notiert werden können
müssen.
In der Implementierung eines Assemblers kann daher zu einem komplexen
variablen Zusatzoperator gegriffen werden, der aus den Teilwertangaben
das insgesamt 128-Bit umfassende Operandenwort formt.
-
Im
Maschinencode werden für
die Transferbefehle der Adresszeiger oder zu schützenden Variablen jeweils zusätzliche
Befehle benötigt,
die entweder im zur Verfügung
stehenden Bitbereich des Maschinencodes noch frei sein müssen oder
in einem neu konstruierten Befehlssatz geschaffen werden können. Prinzipiell
können
diese Befehle in bestehende Prozessorarchitekturen durch geeignete
Codierungen nachgerüstet werden
oder es kann konsistenter ein neuer Befehlssatz konstruiert werden.
-
Erweiterte
Compiler können
zur Erstellung von Objekt- und/oder Maschinencode vorgesehen sein,
der Befehlsanweisungen zur Zulässigkeitsüberwachung
enthält
und den Prozessor auf der oben beschriebenen Weise steuert.