-
ALLGEMEINER
STAND DER TECHNIK
-
GEBIET DER
ERFINDUNG
-
Diese
Erfindung betrifft Computersysteme und insbesondere Vorrichtungen
und ein Verfahren zum Verbessern der Leistung eines Mikroprozessors beim
Ausführen
von Programmen, die aus Programmen übersetzt wurden, die für die Ausführung durch einen
anderen Prozessor vorgesehen sind.
-
BESCHREIBUNG
DES STANDES DER TECHNIK
-
Vor
kurzem wurde ein neuer Mikroprozessor entwickelt, der einen einfachen,
aber schnellen Host-Prozessor (ein "Morph-Host" genannt)
und Software (als "Codemorphingsoftware" bezeichnet) kombiniert,
um Anwendungsprogramme auszuführen,
die für
einen Zielprozessor entwickelt wurden, der einen anderen Befehlssatz
hat als der Morph-Host-Prozessor. Der Morph-Host-Prozessor führt die
Codemorphingsoftware aus, welche die Zielanwendungsprogramme dynamisch
in Host-Prozessor-Befehle übersetzt,
die in der Lage sind, den Zweck der Zielanwendungsprogramme zu erfüllen. Die
Befehle werden im Verlauf ihrer Übersetzung
in einem Übersetzungspuffer
gespeichert, wo ohne weitere Übersetzung
auf sie zugegriffen werden kann. Obgleich die anfängliche Übersetzung
eines Programms langsam ist, fallen nach der Übersetzung viele der Schritte
weg, die normalerweise erforderlich sind, damit Hardware ein Programm
ausführen
kann. Der neue Mikroprozessor hat bewiesen, dass ein einfacher,
schneller Prozessor, der für
einen geringen Leistungsaufwand ausgelegt ist, in der Lage ist, übersetzte "Ziel"-Befehle mit einer
Rate auszuführen,
die derjenigen des "Ziel"-Prozessors, für den die
Programme geschrieben wurden, gleichwertig ist.
-
Das
Problem der Übersetzung
wird durch die verschiedenen Unterbrechungen und Ausnahmen verkompliziert,
die durch die Hardware eines Zielcomputers und dessen Betriebssystem
ausgeführt werden,
damit das Computersystem arbeiten kann. Wenn während des Betriebes eines Zielcomputers eine
Zielausnahme gemacht wird, so muss der Zustand des Computers zum
Zeitpunkt der Ausnahme – in
der Regel durch Aufrufen einer Mikrocodesequenz – gespeichert werden, um die
Operation auszuführen;
das richtige Ausnahme-Steuerprogramm muss aufgerufen werden; die
Ausnahme muss behandelt werden; dann muss der richtige Punkt in
dem Programm gefunden werden, um das Programm fortsetzen zu können. Oft
erfordert dies, dass das Programm zu dem Zustand des Zielcomputers
an dem Punkt zurückkehrt,
an dem die Ausnahme gemacht wurde. Die Ergebnisse, die durch die
Hardware und Software des Zielcomputers erbracht werden, um diese
Operationen auszuführen,
müssen
auf die eine oder andere Weise durch den Prozess der Übersetzung
erbracht werden, damit der Morph-Host-Prozessor
in der Lage ist, richtig auf diese Ausnahmen zu reagieren.
-
Um
Programme, die für
andere Prozessoren geschrieben wurden, mit einer schnellen Rate
laufen lassen zu können,
enthält
der Morph-Host-Prozessor eine Anzahl von Hardware-Erweiterungen. Eine
dieser Erweiterungen ist ein mit Gattern ausgestatteter Datenlagerpuffer,
der vorübergehend
Speicherdatenlager speichert, die aus der Ausführung der übersetzten Befehlssequenz in
dem Übersetzungspuffer
resultieren. Eine zweite Erweiterung ist ein Satz Hostregister (zusätzlich zu
normalen Arbeitsregistern), die den Zustand des Zielprozessors am
Beginn einer Sequenz aus Zielbefehlen, die übersetzt werden, speichern.
Sequenzen aus Zielbefehlen werden in Host-Befehle übersetzt
und ausgeführt.
Die Sequenzen beginnen und enden an Punkten, an denen der Ziel-Zustand
bekannt ist. Wenn die übersetzten
Befehle ausgeführt
werden, ohne dass eine Ausnahme entsteht, so werden die Speicherdatenlager,
die durch die Ausführung
der übersetzten
Host-Befehle erzeugt wurden, durch einen Übergabe-Befehl im Speicher
gespeichert (an den Speicher übergeben); und
die Register, die den Ziel-Zustand gespeichert haben, werden auf
den Ziel-Zustand an dem Punkt aktualisiert, an dem die Sequenz beendet
war.
-
Wenn
es jedoch während
der Ausführung der
Sequenz aus Host-Befehlen
zu einer Ausnahme kommt, so stoppt die Verarbeitung, und die gesamte Operation
kann an den Beginn der Sequenz aus Zielbefehlen zurückgeführt werden,
an dem ein bekannter Zustand des Zielprozessors existiert. Dies
gestattet eine rasche und korrekte Behandlung von Ausnahmen, zu
denen es während
der dynamischen Übersetzung
und Ausführung
von Befehlen kommt.
-
Man
wird feststellen, dass das Verfahren, mit dem der neue Mikroprozessor
die Ausführung
von Übersetzungen
mittels Ablegen der durch die Ausführung entstandenen Ergebnisse
in einem temporären
Speicher bis zum Ende der Ausführung
der Übersetzung
abwickelt, praktisch ein schnelles Spekulationsverfahren ist. Der
neue Mikroprozessor verwendet praktisch den gleichen Schaltungsaufbau
zum Spekulieren über
die Ergebnisse anderer Operationen. Zum Beispiel kann man durch
vorübergehendes Speichern
der Ergebnisse der Ausführung
von Befehlen, die durch ein Software-Steuerprogramm anhand naiv übersetzter
Befehle umgeordnet wurden, eine nachdrücklichere Umordnung erreichen,
als es im Stand der Technik bisher versucht wurde. Wenn eine solche
umgeordnete Befehlssequenz so ausgeführt wird, dass ein richtiges
Ergebnis entsteht, so können
die aus der Ausführung
der umgeordneten Sequenz entstandenen Speicherdatenlager an den Speicher übergeben
werden, und der Ziel-Zustand kann
aktualisiert werden. Wenn die umgeordnete Sequenz während der
Ausführung
eine Ausnahme erzeugt, so kann der Zustand des Prozessors auf den Ziel-Zustand
am Beginn der Sequenz zurückgeführt werden,
und es kann eine konservativere Vorgehensweise bei der Ausführung der
Sequenz verwendet werden.
-
Eines
der vorteilhaftesten Merkmale des neuen Mikroprozessors ist seine
Fähigkeit,
lange Sequenzen aus übersetzten
Befehlen miteinander zu verknüpfen.
Nachdem kurze Sequenzen aus Zielbefehlen übersetzt wurden und festgestellt
wurde, dass sie ohne Ausnahme ausgeführt werden, ist es möglich, diese
kurzen Sequenzen in großer
Zahl zu langen Befehlssequenzen zu verknüpfen. Dadurch kann ein übersetztes
Programm mit hoher Geschwindigkeit ausgeführt werden, weil der Mikroprozessor
nicht sämtliche
Schritte zu durchlaufen braucht (wie beispielsweise das Suchen jeder
der kürzeren übersetzten
Sequenzen), die normalerweise von Hardware-Prozessoren bei der Ausführung von
Befehlen ausgeführt
werden. Es kann sogar eine noch höhere Geschwindigkeit erreicht
werden, als man erwarten könnte,
weil es nach der Verknüpfung
langer Sequenzen oft möglich
ist, dass ein Optimierer viele der Schritte aus den langen Sequenzen
löscht,
ohne das Endergebnis zu verändern.
Hardware-Optimierer sind noch nie in der Lage gewesen, Befehlssequenzen
zu optimieren, die lang genug gewesen wären, um Strukturen zu ermöglichen,
die eine signifikante Optimierung hätten erkennen lassen.
-
Immer,
wenn ein Prozessor Befehle ausführt, läuft er in
einem bestimmten Modus, der verschiedene Merkmale aufweist. Die
Befehle einer Anwendung müssen
im richtigen Modus ausgeführt
werden, um kontinuierlich die richtigen Ergebnisse zu erbringen. Diese
Merkmale eines Modus' sind
praktisch der Hintergrund für
die Befehle und können
als ein Teil der Befehle angesehen werden. Wenn ein Prozessor Befehle
ausführt,
so können
bestimmte dieser Befehle die Merkmale und damit den Betriebsmodus ändern. Dies
erfordert, dass eine Anzahl von Merkmalen des Mikroprozessors anders
eingestellt wird, um diese verschiedenen Modi abzuwickeln. Die Merkmale
des Maschinenstatus',
die korrekt eingestellt sein müssen,
damit Befehle zu dem richtigen Ergebnis führen, nennt man in der Regel
den Kontext, in dem die Befehle ausgeführt werden. Man kann sagen,
dass der Kontext die Gesamtheit des momentanen Status' der Maschine darstellt,
der erforderlich ist, damit die Ausführung von Befehlen zum richtigen
Ergebnis führt.
-
Ein
wesentliches Problem, dem sich der neue Mikroprozessor gegenübersieht,
wenn er Befehlssequenzen, die für
einen Zielprozessor mit einem ersten Befehlssatz gedacht sind, in
eine Sequenz aus Host-Befehlen eines anderen Befehlssatzes übersetzt,
ergibt sich aus der Notwendigkeit, während des Übersetzens und Laufens den
Kontext beizubehalten.
-
Es
gibt eine große
Anzahl verschiedener Dinge, die den Kontext beim Ausführen eines
Programms bilden können.
Die Nennung nur einiger weniger der vielen Elemente, die den Kontext
bilden können,
veranschaulicht, wie kompliziert das Problem ist. Der Fachmann weiß, dass
es buchstäblich Hunderte
möglicher
Kontext-Elemente gibt.
-
Viele
Mikroprozessoren sind dafür
ausgelegt, mit Anwendungsprogrammen zu funktionieren, die Befehle
mit Wortlängen
von acht Bit, sechzehn Bit und zweiunddreißig Bit – je nach der Kapazität des verwendeten
Betriebssystems – haben.
Oft werden die gleichen Befehle bei Anwendungen verwendet, die mit
Befehlen von verschiedenen Wortlängen
geschrieben wurden. Wenn jedoch der Mikroprozessor versucht, 16-Bit-Befehle
auszuführen,
während
seine Merkmale für
die Ausführung
von 32-Bit-Befehlen eingestellt sind, so werden die Befehle vermutlich nicht
richtig ausgeführt.
Das heißt,
die Befehlswortlänge
kann als ein Zielprozessor-Kontext
für Ausführungszwecke
angesehen werden.
-
Als
ein weiteres Beispiel werden Befehle auf verschiedenen Genehmigungsebenen
ausgeführt. Das
heißt,
einige Befehle können
nur durch jemanden ausgeführt
werden, der die höchste
Zugangsstufe besitzt. Andere Befehle können durch Benutzer auf einer
niedrigeren Stufe sowie durch Benutzer auf einer höheren Stufe
ausgeführt
werden. Beim Ausführen übersetzter
Befehle müssen
die gleichen Zugangsstufen beibehalten bleiben, damit Anwendungen
nicht mit Objekten von nicht-zugehörigen Anwendungen in Konflikt
geraten.
-
Auf
Intel X86 basierende Mikroprozessoren gestatten es, dass Anwendungen
angeben können, wo
die verschiedenen Abschnitte (Segmente) von Code und Daten im Speicher
gespeichert werden. Zum Beispiel kann ein Programm Basisadressen
und Längen
für Segmente
des Programms angeben, so dass ein Codesegment an einer Basisadresse
beginnt und sich durch eine Speichermenge hindurch fortsetzt, während ein
Datensegment an einer anderen Basisadresse beginnt und eine andere
Speichermenge beinhaltet. Alternativ kann ein Programm ein einzelnes
Pauschalsegment zuweisen, das zum Speichern von Befehlen, Daten
und sonstigen Elementen des Programms zu verwenden ist. Des Weiteren
können
alle Segmente für
ein bestimmtes Programm an derselben Basisadresse beginnen, jedoch zu
verschiedenen Endadressen reichen. Folglich ist die Anordnung von
verwendeten Basisadressen ein sehr wichtiges Merkmal bei der Ausführung von
Befehlen. Eine Verwechslung der Speicherbereiche, die für verschiedene
Verwendungszwecke zugewiesen wurden, verhindert wahrscheinlich,
dass ein Programm Befehle mit den richtigen Ergebnissen ausführt. Das
heißt,
dies kann ein wichtiges Kontextelement sein.
-
Wenn
eine Anwendung dafür
ausgelegt ist, mit aktiviertem Seitenaustausch ausgeführt zu werden,
dann muss die Anwendung eventuell auftretende Seitenaustausch-Ausnahmen
zulassen. Wenn eine Anwendung für
abgeschalteten Seitenaustausch ausgelegt ist, so kann es zu keinen
Seitenaustausch-Ausnahmen
kommen. Seitenaustausch kann also ein wichtiges Kontextelement sein.
-
Es
gibt viele weitere Merkmale, die die gleichen sein müssen, wann
immer die Befehle so ausgeführt
werden, wie sie kompiliert wurden, damit die Befehle die richtigen
Ergebnisse erbringen. Bei komplizierten Befehlssätzen wie jenen, die von Intel X86-Prozessoren
verwendet werden, ist die Zahl der Merkmale, die einen Kontext bilden,
recht groß.
-
Wie
bei der Ausführung
von Befehlen durch den Zielprozessor ist es erforderlich, dass Host-Befehle,
die aus Zielbefehlen übersetzt
werden, den Kontext des ursprünglichen
Prozessors beibehalten, für
den die Zielbefehle vorgesehen waren, wenn diese übersetzten
Befehle ausgeführt
werden, damit das Host-System zu den gleichen Ergebnissen kommt.
Weil diese Kontextelemente, die anhand der Befehle zu anderen Ergebnissen
führen
können,
von der Übersetzung
bis zur Ausführung
konstant bleiben müssen,
würde dies
augenscheinlich erfordern, dass buchstäblich Hunderte Kontextelemente
zu einem Bestandteil jeder Übersetzung
gemacht werden müssten,
um zu gewährleisten,
dass die hervorgebrachten Ergebnisse die richtigen sind.
-
Obgleich
es beim Ausführen
von Befehlen in einem Prozessor von entscheidender Bedeutung ist, richtige
Ergebnisse hervorzubringen, ist es ebenso wünschenswert, Befehle so schnell
wie möglich
auszuführen.
Dies geschieht im Allgemeinen durch Erzeugen von Code, der so effizient
wie möglich
abläuft.
Der Kontext oder Maschinenzustand steuert, wie effizient der Code
gemacht werden kann. Es gibt viele Merkmale des Maschinenzustands,
in dem Befehle ausgeführt
werden, die sich auf die Effizienz der Übersetzung und Ausführung auswirken
und den Ablauf der Befehle beschleunigen können oder eine sonstige wünschenswerte
Auswirkung auf die Ausführung
haben. In allen Fällen
ist es wichtig, dass Befehle, die in einem bestimmten Modus in dem
Ziel-Mikroprozessor ausgeführt
werden, in einer Umgebung ausgeführt
werden, deren Merkmale so eingestellt sind, dass Befehle in dem
gleichen Modus in dem Host-System ausgeführt werden. Des Weiteren ist
es wichtig, dass der Übersetzungs kontext,
in dem die Optimierung der Übersetzung
des Zielcodes erfolgt, bei der Ausführung dieses optimierten Codes
beibehalten bleibt.
-
Folglich
ist es wünschenswert,
Vorrichtungen und Verfahren bereitzustellen, die es einem Mikroprozessor,
der Befehle ausführt,
die aus Befehlen übersetzt
wurden, die für
einen Zielprozessor vorgesehen sind, der einen anderen Befehlssatz
hat, ermöglichen,
den Kontext des Zielprozessors beizubehalten, so dass die Ausführung der übersetzten
Befehle zu den richtigen Ergebnissen führt.
-
Es
ist gleichermaßen
wünschenswert,
dass die Geschwindigkeit, die durch die von dem neuen Mikroprozessor
ausgeführte
dynamische Übersetzung
und Optimierung gewährleistet
wird, in Rahmen der Sicherstellung, dass die Übersetzung in dem gleichen
Kontext ausgeführt
wird wie der, für
den sie ursprünglich
vorgesehen war, aufrecht erhalten bleibt.
-
"DAISY/390: Full System
Binary Translation of IBM System/390", Michael Gschwind, Kemal Ebcioglu,
Erik Altman, Sumedh Sathaye, IBM Research Report RC22027, Seiten
1 bis 45, beschreibt ein Verfahren zum Übersetzen von Befehlen aus
einer Architektur in eine andere, wobei ein Übersetzungskontext für einen Übersetzungsschritt
ausgewählt
wird, wenn Speicheradressen formuliert werden.
-
KURZDARSTELLUNG
DER ERFINDUNG
-
Aspekte
der Erfindung sind in den begleitenden Ansprüchen dargelegt.
-
Es
ist wünschenswert
zu gewährleisten, dass
die übersetzten
Befehle in dem gleichen Übersetzungskontext
ausgeführt
werden wie der, in dem sie ursprünglich übersetzt
wurden, und dies wann immer möglich
ohne Verlangsamung der Ausführung der übersetzten
Befehle zu tun.
-
Ein
Verfahren gemäß einer
bevorzugten Ausführungsform
der Erfindung behält
den Übersetzungskontext
für jeden
Abschnitt von übersetzten Befehlen
bei, vergleicht den Übersetzungskontext,
in dem der Morph-Host arbeitet, wann immer ein neuer Abschnitt von übersetzten
Befehlen ausgeführt
werden soll, mit dem Übersetzungskontext
beim Übersetzen
des Abschnitts aus übersetzten
Befehlen, gestattet die Ausführung,
wenn die Übersetzungskontexte
die gleichen sind, und erzwingt eine Suche nach einer anderen Übersetzung
oder eine Neuübersetzung
der ursprünglichen
Befehle, aus denen der Abschnitt der übersetzten Befehle abgeleitet
wurde, wenn die Übersetzungskontexte
verschieden sind.
-
Merkmale
der Erfindung werden anhand des Studiums der folgenden detaillierten
Beschreibung in Verbindung mit den Zeichnungen besser verstanden. In
den Zeichnungen werden gleichartige Elemente in den verschiedenen
Ansichten mit den gleichen Bezeichnungen versehen.
-
KURZE BESCHREIBUNG
DER ZEICHNUNGEN
-
1 ist
ein Flussdiagramm, das ein Verfahren gemäß einer bevorzugten Ausführungsform
der Erfindung veranschaulicht,
-
2 ist
ein Schaubild, das die Schritte veranschaulicht, die zur Ausführung eines
bestimmten Befehls erforderlich sind.
-
3 ist
ein Flussdiagramm, das ein Verfahren zur Durchführung einer bevorzugten Ausführungsform
der Erfindung veranschaulicht.
-
4 ist
ein Flussdiagramm, das einen Abschnitt des Verfahrens gemäß einer
bevorzugten Ausführungsform
der Erfindung veranschaulicht.
-
5 ist
ein Flussdiagramm, das einen anderen Abschnitt des Verfahrens gemäß einer
bevorzugten Ausführungsform
der Erfindung veranschaulicht.
-
6 ist
ein Schaubild, das Kontextdarstellungen gemäß einer bevorzugten Ausführungsform der
Erfindung veranschaulicht.
-
DETAILLIERTE
BESCHREIBUNG
-
Wie
oben bereits in einigem Detail beschrieben wurde, führt der
neue Mikroprozessor Codemorphingsoftware aus, die Sequenzen aus
Zielbefehlen in Sequenzen aus Host-Befehlen übersetzt, diese Sequenzen aus übersetzten
Befehlen in einem Übersetzungspuffer
zur Wiederverwendung speichert, versucht, diese Sequenzen aus übersetzten
Befehlen auszuführen,
Zustand und Speicher aktualisiert, wenn übersetzte Sequenzen ausgeführt werden,
um ein richtiges Ergebnis zu erbringen, und die Folgen einer versuchten
Ausführung
von Sequenzen aus übersetzten
Befehlen, deren Ausführung
zu keinem korrekten Ergebnis führt,
verwirft. Die gespeicherten Sequenzen aus übersetzten Befehlen können optimiert
und oft miteinander verknüpft
werden, so dass lange Sequenzen aus übersetzten Befehlen entstehen.
Diese langen Sequenzen können
weiter optimiert werden, um ihre Länge zu reduzieren und ihre Ausführungseffizienz
zu steigern, so dass der neue Prozessor Operationen oft viel schneller
ausführen kann
als die ursprünglichen Übersetzungen.
-
Damit
eine Sequenz aus übersetzten
Befehlen zu dem Ergebnis führt,
das durch die ursprünglichen
Zielbefehle hervorgebracht wurde, muss der neue Prozessor jeden
der Zielbefehle richtig decodieren. Das bedeutet, dass der neue
Prozessor gewährleisten
muss, dass die übersetzten
Befehle den gesamten Kontext der ursprünglichen Befehle enthalten,
so dass Sinn und Inhalt jener ursprünglichen Befehle vollständig übersetzt
werden. Zum Beispiel muss eine Übersetzung
in der Lage sein, Informationen zu bestimmen, die den Segmenttyp,
ihre Basisadresse und ihren Umfang definieren, damit korrekte Speicherzugriffe
erfolgen können.
Eine Übersetzung muss
in der Lage sein zu bestimmen, ob während der Ausführung Seitenaustausch
aktiviert ist, um zu wissen, wie Adressen berechnet werden und ob
Seitenaustausch-Ausnahmen akzeptiert werden sollen. Eine Übersetzung
muss in der Lage sein, alle sonstigen Kontextelemente zu bestimmen,
die es ermöglichen,
das Ergebnis, das durch die Ziel-Sequenz erreicht wird, aus der
sie übersetzt
wurde, zu erreichen, wenn die übersetzte
Sequenz durch den Host-Prozessor
ausgeführt
wird.
-
Zum
Beispiel befiehlt ein Befehl wie beispielsweise der folgende für einen
X86-Prozessor:
add $eax 4($ebp);
einem X86-Prozessor,
zu dem Wert in dem "ebp"-Register Vier zu
addieren, um einen Segmentversatz zu bestimmen. Dieser Segmentversatz
wird überprüft, um zu
bestimmen, ob er innerhalb der Segmentgrenzen für das Speichersegment, auf
das zugegriffen wird (das Stapelsegment), liegt. Außerdem überprüft der X86-Prozessor,
ob der Befehl das Speichersegment, auf das zugegriffen wird, lesen
und/oder beschreiben darf. Und schließlich wird der Segmentversatz
zu der Segmentbasis addiert, um eine lineare Adresse zu erzeugen,
die ihrerseits dafür
verwendet, die physikalische Adresse der Speicherposition, auf die
durch den Befehl zugegriffen wird, zu bestimmen. Die physikalische
Adresse wird dann dafür
verwendet, den Wert abzurufen, der in der Speicherposition gespeichert
ist, und den Speicherwert zu dem Wert in dem "eax"-Register
zu addieren.
-
Zusätzlich zu
diesen Elementen des Befehls gibt es aber noch eine große Zahl
impliziter Elemente. Zum Beispiel impliziert die Verwendung des "ebp"-Registers hier die
Verwendung des Stapelsegments. Die Verwendung eines anderen Registers könnte die
Verwendung eines anderen Segments implizieren.
-
X86-Segmente
können "nach oben wachsen" oder "nach unten wachsen". Stapelsegmente wachsen
häufig
nach unten, während
andere Segmente gewöhnlich
nach oben wachsen. Die Feststellung, ob ein Segmentversatz für ein bestimmtes
Segment valid ist, hängt
davon ab, ob das Segment, auf das zugegriffen wird, nach oben wächst oder
nach unten wächst.
Für ein
nach oben wachsendes Segment reichen die validen Versatzbereiche
von 0 bis zur Segmentgrenze. Für
ein nach unten wachsendes Segment reichen die validen Versatzbereiche
von der Segmentgrenze bis zum größtmöglichen
Versatz (216 – 1) für 16-Bit-Segmente und (232 – 1)
für 32-Bit-Segmente.
-
Wenn
die lineare Adresse berechnet wurde, so wird ermittelt, ob Seitenaustausch
aktiviert ist. Wenn nicht, so ist die lineare Adresse die physikalische
Adresse der Speicherdaten. Wenn Seitenaustausch aktiviert ist, so
muss die physikalische Adresse berechnet werden. In beiden Fällen müssen die Grenzen
des Speichersegments getestet werden, um zu bestimmen, ob die Adresse
gültig
ist. Und schließlich
wird auf die Daten zugegriffen, und sie werden zu dem Wert in dem "eax"-Register addiert.
-
Das
heißt,
für diesen
einfachen Befehl sind das Wissen, dass das "ebp"-Register
ein Stapelregister ist, die Basisadresse des Stapels im Speicher,
der Bereich valider Versatzbereiche für das Segment in Abhängigkeit
davon, ob das Segment nach oben wächst oder nach unten wächst, ob
Seitenaustausch aktiviert ist, der Typ des Speichersegments, das adressiert
wird, und seine Basisadresse allesamt Merkmale, aus denen ein Kontext
besteht, und müssen
bekannt sein, damit die übersetzten
Befehle in der Lage sind, bei Ausführung die Operation richtig durchzuführen.
-
Wenn
ein Interpretierer einen Ziel-Befehl ausführt, so muss er alle diese
impliziten (d. h. Hintergrund-)Schritte und Überprüfungen ausführen, um den Befehl richtig
auszuführen.
Die impliziten Schritte und Überprüfungen müssen explizit
mit möglicherweise
hohem Aufwand ausgeführt
werden. Das gleiche würde
für eine
naive Übersetzung
eines Ziel-Befehls in Host-Befehle gelten.
-
Wie
dem Fachmann bewusst ist, können
Befehle den Kontext, in dem Befehle ausgeführt werden, verändern, indem
eines der Merkmale verändert wird,
die einen Betriebsmodus bilden. Folglich muss der neue Prozessor
Befehle verfolgen und gewährleisten,
dass sich Kontextelemente innerhalb der übersetzten Sequenz ändern, wenn
ein Ziel-Befehl den Kontext ändert,
in dem die Sequenz aus übersetzten
Befehlen ausgeführt
werden soll. Auf diese Weise wird der Kontext der übersetzten
Sequenz richtig für
den neuen Prozessor dargestellt, wenn die übersetzte Sequenz fertig ausgeführt ist.
-
Doch
es muss nicht nur jede Sequenz aus übersetzten Befehlen die Informationen
enthalten, anhand derer alle erforderlichen Merkmale, aus denen
ein Kontext besteht, bestimmt werden können. Wann immer eine Sequenz
aus übersetzten
Befehlen richtig ausgeführt
ist und eine nächste
Sequenz ausgeführt
werden soll, muss der neue Prozessor gewährleisten, dass der Kontext,
in dem er momentan arbeitet, der Kontext ist, der für die richtige
Ausführung
des Beginns der nächsten
Sequenz benötigt wird.
Das heißt, der
neue Prozessor muss den Kontext prüfen, der am Ende der ersten
Sequenz aus übersetzten
Befehlen vorhanden ist, um zu gewährleisten, dass er der gleiche
ist wie der Kontext, der von der nächsten Sequenz aus übersetzten
Befehlen benötigt
wird, bevor er mit dem Ausführen
der nächsten
Sequenz beginnen kann.
-
In ähnlicher
Weise muss der neue Prozessor, um zwei Sequenzen aus übersetzten
Befehlen zu einer einzelnen Sequenz zu verknüpfen, sicherstellen, dass der
Kontext, in dem die erste Sequenz die Ausführung beendet, der gleiche
ist wie der Kontext, in dem die Sequenz, mit der sie verknüpft werden
soll, mit dem Ausführen
beginnt.
-
Wie
zu erkennen ist, führt
die Notwendigkeit, sämtliche
Kontextelemente in jede Sequenz aus übersetzten Befehlen einzubinden
und den Kontext jeder neuen Sequenz zu überprüfen, bevor mit der Ausführung begonnen
wird, zu keinem effizienten Code.
-
Bevorzugte
Ausführungsformen
der vorliegenden Erfindung überwinden
dieses Problem und erzeugen einen Code, der effizient mit einer
Rate ausgeführt
wird, der mit der Rate zu vergleich ist, mit der ein Zielprozessor
den gleichen Code ausführt. Ausführungsformen
der vorliegenden Erfindung stützen
sich auf die Eigenschaft der Örtlichkeit,
einen Code zu erzeugen, der effizienter ausgeführt werden kann.
-
Genauer
gesagt, besteht in den meisten Fällen
die Tendenz, dass die Befehle, die ein Prozessor in einem Prozess
oder Programm ausführt,
mehr als einmal ausgeführt
werden oder die meiste Zeit mit anderen Befehlen ausgeführt werden.
Das hat zur Folge, dass der Kontext von einer Befehlssequenz zur
nächsten ähnlich oder
identisch ist. Zum Beispiel hängen
viele Kontextelemente von dem konkreten Speichersegment ab, auf
das zugegriffen wird. Eine Segmentbasisadresse und ein Segmentumfang,
ob das Segment nach oben oder nach unten wächst, und ob das Segment beschreibbar
ist oder nur gelesen werden kann, sind allesamt Elemente, die von dem
Segment, auf das zugegriffen wird, abhängen. Diese Elemente sind die
gleichen, wenn das Segment von einer Sequenz zur nächsten das
gleiche ist. In den meisten Fällen
ist ein Speichersegment, das für
eine erste Sequenz verwendet wird, das gleiche wie das Segment,
das für
eine nächste
Sequenz verwendet wird. Andere Kontextelemente weisen ebenfalls
das Merkmal der Örtlichkeit
auf. Die Eigenschaft der Örtlichkeit
gestattet es bevorzugten Ausführungsformen
der vorliegenden Erfindung, davon auszugehen, dass der Kontext von
einer Sequenz zur nächsten
Sequenz der gleiche ist.
-
Die
Annahme, dass der Kontext der gleiche ist, gestattet es dem neuen
Prozessor beim Übersetzen
einer Befehlssequenz, den Kontext auf die eine oder andere Weise
als eine Invariante darzustellen, um eine Übersetzung ordnungsgemäß auszuführen. Anstatt
jeden der Tests zu durchschreiten, die erforderlich sind, um festzustellen,
dass der Kontext für die Übersetzung
der richtige ist, überprüft der Prozessor
dann lediglich die Darstellung, um festzustellen, dass der gesamte
Kontext der gleiche ist. Wenn er der gleiche ist, so kann die übersetzte
Sequenz ausgeführt
werden. Wenn er nicht der gleiche ist, so sucht der Prozessor nach
einer anderen Übersetzung,
die den Kriterien entspricht. Wenn keine gefunden wird, so muss
eine neue Übersetzung
erzeugt werden. Das allgemeine Verfahren ist in dem Flussdiagramm
von 1 veranschaulicht.
-
Es
ist zu sehen, dass diese Verwendung der Eigenschaft der Örtlichkeit
es ermöglicht,
eine Sequenz aus übersetzten
Befehlen um jene Befehle zu verkürzen,
die durch die Kontextelemente, die als Invarianten behandelt werden,
impliziert werden. 2 veranschaulicht eine Ablauffolge,
in der die Schritte dargestellt sind, die nötig sind, damit ein Interpretierer
die Schritte der oben beschriebenen Addierfunktion ausführen kann.
Wie zu sehen ist, sind wenigstens zehn dieser Schritte Schritte,
von denen der Kontext verlangt, dass sie in die Sequenz aufgenommen
werden, um zu gewährleisten,
dass die Operation so ausgeführt
wird, dass das gleiche Ergebnis entsteht wie bei der Addierfunktion.
Jene Operationen, die mit einem Sternchen markiert sind, können aus der
Befehlssequenz herausgenommen und auf irgend eine Weise am Beginn
der übersetzten
Sequenz dargestellt werden. Zum Beispiel könnten Kontextelemente, die
von einem oder dem anderen zweier Zustände sind, jeweils durch ein
einzelnes Bit in einer vorgegebenen Position einer ersten Kontextdarstellung
dargestellt werden (zum Beispiel ein Vierfachwort), während Merkmale
mit einer größeren Anzahl
von Zuständen
eine größere Anzahl
von Bits in anderen vorgegeben Positionen des Vierfachwortes erfordern
könnten.
-
3 ist
ein Flussdiagramm, das den Betrieb des neuen Prozessors beim Beenden
der Ausführung
einer ersten Sequenz aus übersetzten
Befehlen und dem Beginnen einer nächsten Sequenz veranschaulicht.
Der erste veranschaulichte Schritt ist eine Prüfung des Kontexts der nächsten Befehlssequenz.
Der neue Prozessor sieht sich seine momentane Kontextdarstellung
an (der Kontext, mit dem die Maschine arbeitete, als die erste Sequenz vollendet
wurde), und vergleicht diesen Kontext mit der Kontextdarstellung
der nächsten
Sequenz. Wenn der Kontext vollkommen der gleiche ist, so wird die nächste Sequenz
aus übersetzten
Befehlen in dem gleichen Kontext wie die vorherige Sequenz ausgeführt. Dadurch
fallen sämtliche
Schritte fort, die in einer vorherigen Sequenz benötigt wurden,
um zu bestimmen, ob der Kontext der richtige war. Anstatt die Schritte
von 2 auszuführen,
die mit einem Sternchen markiert sind, geht der neue Prozessor davon aus,
dass jede Bedingung erfüllt
ist, und führt
die folgenden Schritte entsprechend aus.
-
Wenn
der gesamte Kontext nicht der gleiche ist, so wird die nächste Befehlssequenz
nicht ausgeführt.
Statt dessen sucht der neue Prozessor nach einer anderen Sequenz
aus übersetzten
Befehlen, die die Kriterien für
die nächste
Sequenz erfüllt.
In der Regel ist dies eine andere Übersetzung derselben Sequenz
aus Zielbefehlen, die aber die gleiche Kontextdarstellung hat wie
die Kontextdarstellung der zuletzt ausgeführten Sequenz. Es ist möglich, dass
eine solche Sequenz nicht existiert. Wenn das der Fall ist, so führt der
neue Prozessor die Codemorphingsoftware aus, um eine solche Übersetzung
zu erzeugen, und speichert die Übersetzung
in dem Übersetzungspuffer
mit ihrer Kontextdarstellung zur weiteren Verwendung.
-
Um
zu gewährleisten,
dass der Kontext, in dem eine Sequenz aus übersetzten Befehlen ausgeführt wird,
der richtige ist, ist es notwendig, dass die Codemorphingsoftware
vorhersagbare Veränderungen
des Kontexts verfolgt und die Kontextdarstellung zu einer richtigen
Darstellung ändert,
wenn es zu einer Veränderung
kommt. Auf diese Weise wird der Kontext, in dem der Host-Prozessor
momentan arbeitet, korrekt dargestellt, wenn eine Prüfung des Kontexts
einer nächsten
Sequenz vorgenommen wird.
-
Es
ist außerdem
wichtig, dass die Codemorphingsoftware einen Befehl erkennt, der
den Kontext auf unvorhersagbare Weise verändert. Wenn zum Beispiel ein
Befehl ein neues Segmentregister lädt, so können sich sämtliche Kriterien, die sich
mit einem Segment ändern
können,
verändern.
Nach dem Laden des Segmentregisters ist ein neuer Kontext in Kraft,
und der neue Kontext muss für
die Ausführung von
Befehlen ab jenem Punkt in der Sequenz verwendet werden. Jeder anschließende Befehl,
der von den betroffenen Abschnitten des Kontexts abhängt (zum
Beispiel ein Befehl, der auf das geladene Segmentregister zugreift),
kann nicht ausgeführt
werden, ohne dass verifiziert wird, dass der neue Kontext der richtige
ist. Die Codemorphingsoftware kann die Übersetzung an jedem beliebigen
Punkt zwischen den beiden beenden und/oder veranlassen, dass der Kontext
zwischen dem Punkt, wo er modifiziert wird, und dem Punkt, wo der
anschließende
Befehl von dem aktualisierten Wert abhängt, verifiziert wird.
-
Weil
durch das Verknüpfen
verschiedener übersetzter
Sequenzen in der Weise, dass sie als eine einzelne längere Sequenz
funktionieren, eine signifikante Beschleunigung der Ausführung erreicht wird,
ist die Verwendung des Verknüpfungsprozesses
durchaus wünschenswert.
Es versteht sich, dass, wenn zwei Sequenzen miteinander verknüpft werden
sollen, es notwendig ist, dass jeder Abschnitt der längeren Sequenz
korrekt ausgeführt
wird. Folglich ist es notwendig, dass der Kontext der richtige ist, damit
jeder Abschnitt der längeren
Sequenz richtig ausgeführt
wird. Dies kann bei einer Ausführungsform
der Erfindung dadurch erreicht werden, dass man eine erste übersetzte
Sequenz mit einer zweiten unter Verwendung der Adresse der zweiten übersetzten
Sequenz verknüpft.
Bei dem neuen Prozessor wird die Adresse in der Regel in einer Programmsteuereinheit
gespeichert. Wenn eine Sequenz mit einer anderen verknüpft werden
soll, so endet die erste Sequenz mit einem Hinweis auf die Adresse
in der Programmsteuerung. Wenn die zweite Sequenz begonnen wird,
so überprüft die Übersetzung
die Kontextdarstellung, um zu gewährleisten, dass der Kontext der
gleiche ist wie der Kontext, der von der zweiten Sequenz benötigt wird.
-
Das
Prüfen
des Kontexts des Host anhand der Darstellung des von der zweiten
Sequenz benötigten
Kontexts für
jede verknüpfte
Sequenz nimmt einige Operationszyklen in Anspruch. Folglich entfernt
eine höherentwickelte
Ausführungsform
der Erfindung die Kontextprüfung
aus der Übersetzung
und verlagert sie in den ursprünglichen
Verknüpfungsprozess,
wie in 4 veranschaulicht. Das heißt, wenn zuerst festgestellt
wird, dass zwei Sequenzen miteinander zu verknüpfen sind, so wird der Kontext,
in dem die erste Sequenz ausgeführt
wird, an ihrem Ende mit dem Kontext verglichen, in dem die zweite Sequenz
die Ausführung
beginnt, indem die Kontextdarstellung von beiden verglichen wird.
Wenn die Kontextdarstellungen die gleichen sind, so wird die Verknüpfung hergestellt.
Danach ist es bei Ausführung
der längeren
Sequenz nicht mehr notwendig, den Kontext an dem Punkt, an dem die
zwei Sequenzen miteinander verknüpft
sind, zu prüfen.
Das Ende der ersten Sequenz verweist lediglich auf die Adresse der
zweiten Sequenz, und die Verknüpfung
wird hergestellt. Die Ausführung
von Befehlen wird dadurch beschleunigt, dass man den Kontext lediglich zum
Zeitpunkt der ursprünglichen
Verknüpfung
prüft, und
nicht jedes Mal, wenn die miteinander verknüpften Sequenzen ausgeführt werden.
-
In
einer ähnlichen
Weise sucht eine Ausführungsform
jedes Mal, wenn eine Suche nach einer Übersetzung ausgeführt wird,
sowohl nach einer bestimmten Übersetzung
als auch nach einem bestimmten Kontext. Auf diese Weise wird der
Prüfvergleich
zwischen dem Maschinenbetriebskontext und dem benötigten Übersetzungskontext
komplett aus den übersetzten
Sequenzen herausgenommen und in die Abfertigungsfunktion der Codemorphingsoftware
verlagert, wie in 5 veranschaulicht. Die Abfertigungsfunktion
sucht im Wesentlichen nach einer nächsten Sequenz aus übersetzten
Befehlen zum Ausführen
mittels Durchsuchen des Übersetzungspuffers
nach einer richtigen Übersetzung
und einem richtigen Kontext, wann immer entweder eine nächste Übersetzung
benötigt
wird oder eine vorgesehene Verknüpfung
hergestellt werden soll.
-
Ausführungsformen
der vorliegenden Erfindung stellen Erweiterungen bereit, um die
Ausführung
von Befehlen weiter zu beschleunigen. Eine Erweiterung, die durch
Ausführungsformen
der vorliegenden Erfindung bereitgestellt wird, ermöglicht das Herstellen
einer Verknüpfung
in Fällen,
wo ein Befehl den Kontext in unvorhersagbarer Weise verändert.
-
Die
Operation ermöglicht
eine Verknüpfung zu
der Adresse, die von der Programmsteuerung gespeichert wird, gefolgt
von einer Prüfung
des neuen Kontexts anhand des momentanen Kontexts. Wenn die Kontextdarstellungen
die gleichen sind, so kann die Verknüpfung fortgesetzt werden.
-
Eine
andere Erweiterung (auch in 5 gezeigt)
stützt
sich auf die Tatsache, dass es nicht immer notwendig ist, dass eine
neu übersetzte
Sequenz einen Kontext hat, der mit dem momentanen Kontext, in dem
der Host arbeitet, identisch ist, um ein korrektes Ergebnis hervorzubringen.
Einige übersetzte
Sequenzen brauchen weniger Kontextelemente oder weniger begrenzende
Kontextelemente als der Kontext, in dem der Host arbeitet. Solche
Sequenzen können
ausgeführt
und mit früheren
Sequenzen verknüpft
werden, solange der Kontext vorhanden ist, der für die richtige Ausführung der
noch auszuführenden
Sequenz benötigt
wird. Dies kann geprüft
werden, indem die Kontextdarstellung einer auszuführenden übersetzten
Sequenz mit der Darstellung des momentanen Kontexts des Host verglichen
wird, um jene Kontextelemente zu bestimmen, die voneinander verschieden
sind. Dann werden die Elemente, die sich unterscheiden, begutachtet,
um festzustellen, ob sie für
die auszuführende
Sequenz notwendig sind, und wenn sie notwendig sind, ob der Unterschied
darin besteht, dass sie in der auszuführenden Sequenz weniger einschränkend sind.
Wenn die Kontextelemente nicht benötigt werden oder weniger einschränkend sind,
so kann Sequenz ausgeführt
oder verknüpft
werden.
-
Die
Art und Weise der Darstellung des Kontexts kann über ein breites Spektrum hinweg
variieren, wie in 6 gezeigt ist. Wenn zum Beispiel
alle Kontextelemente nach dem Verketten nicht mehr Bits in Anspruch
nehmen, als ohne Weiteres in einem Maschinenregister verfügbar sind
(zum Beispiel 32 oder 64 Bits), so kann der Kontext dann durch eine
solche Verkettung dargestellt werden, und die Prüfungen können auf einfache Weise mittels
einfacher Bit- Operationen
an den Darstellungen vorgenommen werden (zum Beispiel XOR und AND).
Alternativ können, wenn
die Anzahl und die Größe der Elemente
in dem Kontext die Anzahl der Bits übersteigen, die ohne Weiteres
in einem Register verfügbar
sind, die Kontextelemente in einer Datenstruktur im Speicher gespeichert
werden, und die Zeiger, die in die Datenstruktur hinein verweisen,
können
dazu verwendet werden, Vergleiche auf genaue Kontextübereinstimmungen
vorzunehmen. Die Zeiger sind dann die Kontextdarstellung. Tiefergehende
Vergleiche (bei keinen exakten Übereinstimmungen),
die von den einzelnen Kontextelementen abhängen, würden auf die Datenstrukturen
im Speicher zugreifen müssen.
-
Ein
weiteres Verfahren der Darstellung des Kontexts ist ein Hybrid dieser
beiden Techniken. Einige der Elemente können direkt dargestellt werden, während andere
im Speicher gespeichert werden. Der übrige Teil der Darstellung
ist ein Zeiger/Index auf die Datenstruktur im Speicher. Auch hier
sind direkte Vergleiche unkompliziert, während elementabhängige Vergleiche
tiefer gehen würden.