-
Gebiet der
Erfindung
-
Diese
Erfindung betrifft Computersysteme, und genauer einen verbesserten
Mikroprozessor, der Verfahren und Vorrichtungen zum Speichern häufig benutzter
Speicherdaten für
einen schnelleren Zugriff in Registern benutzt.
-
Geschichte
des Stands der Technik
-
Es
gibt tausende von Anwendungsprogrammen, die an Computern laufen,
welche um bestimmte Familien von Mikroprozessoren gestaltet sind.
Die größte Anzahl
der bestehenden Programme ist dazu bestimmt, an Computern (allgemein
als "IBM-kompatible
Personalcomputer" bezeichnet)
zu laufen, die die Mikroprozessorfamilie „X86" (einschließlich Intel® 8088,
Intel 8086, Intel 80186, Intel 80286, i386, i486, und weiter durch die
verschiedenen Pentium®-Mikroprozessoren) verwenden,
die von der Intel Corporation, Santa Clara, Kalifornien gestaltet
und hergestellt wird. Es gibt viele andere Beispiele für Programme,
die dazu bestimmt sind, an Computern zu laufen, die andere Familien
von Prozessoren verwenden. Da es so viele Anwendungsprogramme gibt,
die an diesen Computern laufen, besteht ein großer Markt für Mikroprozessoren, die zur
Verwendung in derartigen Computern fähig sind, besonders Computern,
die dazu bestimmt sind, X86-Programme zu verarbeiten. Der Mikroprozessormarkt
ist nicht nur groß,
sondern auch ziemlich lukrativ.
-
Obwohl
der Markt für
Mikroprozessoren, die fähig
sind, große
Zahlen von Anwendungsprogrammen auszuführen, groß und lukrativ ist, ist es
ziemlich schwierig, einen neuen Konkurrenzmikroprozessor zu gestalten.
Obgleich zum Beispiel die Prozessorfamilie X86 für eine Anzahl von Jahren besteht
und diese Prozessoren in der Mehrheit der verkauften und verwendeten
Computer enthalten sind, gibt es wenige erfolgreiche Konkurrenzmikroprozessoren,
die fähig
sind, X86-Programme
auszuführen.
Die Gründe
dafür sind
zahlreich.
-
Um
erfolgreich zu sein, muss ein Mikroprozessor fähig sein, alle Programme (einschließlich Betriebssystemen
und Vorläuferprogrammen),
die für
diese Prozessorfamilie bestimmt sind, so schnell wie bestehende Prozessoren
auszuführen,
ohne mehr als bestehende Prozessoren zu kosten. Zusätzlich muss
ein neuer Mikroprozessor, um wirtschaftlich erfolgreich zu sein,
zumindest eines dieser Dinge besser als bestehende Prozessoren tun,
um Käufern
einen Grund zu geben, den neuen Prozessor bestehenden Prozessoren
vorzuziehen.
-
Es
ist schwierig und teuer, einen Mikroprozessor dazu zu bringen, dass
er so schnell wie Mikroprozessoren des Stands der Technik läuft. Prozessoren
führen
Befehle durch Basistätigkeiten
wie Laden, Verschieben, Addieren, Speichern, und ähnliche
Tätigkeiten
niedriger Ebene durch und sprechen bei der Ausführung jeglichen Befehls, der
durch ein Anwendungsprogramm geliefert wird, nur auf derartige Basisbefehle
an. Zum Beispiel hat ein Prozessor, der dazu bestimmt ist, die Befehle
eines Computers mit kompliziertem Befehlssatz (complicated instruction
set computer, CISC) wie etwa eines X86, in dem Befehle den auszuführenden
Prozess auf einer verhältnismäßig hohen
Ebene bezeichnen, historisch einen Nurlesespeicher (ROM) enthalten,
der sogenannte Mikrobefehle speichert. Jeder Mikrobefehl enthält eine
Abfolge von Basisbefehlen, die, wenn sie nacheinander ausgeführt werden,
das durch den CISC-Befehl der hohen Ebene befohlene Ergebnis herbeiführen. Typischerweise
wird ein CISC-Befehl „addiere
A zu B" decodiert,
um ein Nachschlagen einer Adresse im ROM zu verursachen, an der
ein Mikrobefehl zur Ausführung
der Funktionen des Befehls „füge A zu
B hinzu" gespeichert
ist. Der Mikrobefehl wird geladen, und seine Basisbefehle werden
hintereinander ausgeführt, um
zu verursachen, dass der Befehl „addiere A zu B" ausgeführt wird.
Bei einem derartigen CISC-Computer können die Basistätigkeiten
in einem Mikrobefehl während
der Programmausführung
niemals verändert
werden. Jeder CISC-Befehl
kann nur durch Decodieren des Befehls, Ansprechen und Abrufen des
Mikrobefehls, und Ausführen
der Abfolge der Basistätigkeiten
in der Reihenfolge, die im Mikrobefehl bereitgestellt ist, ausgeführt werden.
Jedes Mal, wenn der Mikrobefehl ausgeführt wird, muss der gleichen
Abfolge gefolgt werden.
-
Prozessoren
des Stands der Technik zur Ausführung
von X86-Anwendungen
benutzen eine Anzahl von Techniken, um die schnellstmögliche Verarbeitung
zu einem Preis bereitzustellen, der immer noch wirtschaftlich vernünftig ist.
Jedweder neue Prozessor, der bekannte Hardwaretechniken ausführt, um
die Geschwindigkeit, mit der ein Prozessor laufen kann, zu beschleunigen,
muss den hohen Entwicklungsstand der Verarbeitungshardware erhöhen. Dies
erfordert das Erhöhen
der Kosten der Hardware.
-
Zum
Beispiel weist ein superskalarer Mikroprozessor, der mehrere Verarbeitungskanäle verwendet, um
zwei oder mehr Tätigkeiten
auf einmal auszuführen,
eine Anzahl von zusätzlichen
Anforderungen auf. Auf der grundlegendsten Ebene könnte ein
einfacher superskalarer Mikroprozessor jeden Anwendungsbefehl in die
Mikrobefehle decodieren, die die Funktion des Anwendungsbefehls
ausführen.
Dann plant der einfache superskalare Mikroprozessor, dass zwei Mikrobefehle
gemeinsam laufen, wenn die beiden Mikrobefehle nicht die gleichen
Hardwarebetriebsmittel benötigen
und die Ausführung
eines Mikrobefehls nicht von den Ergebnissen von anderen Mikrobefehlen,
die verarbeitet werden, abhängt.
-
Ein
fortschrittlicherer superskalarer Mikroprozessor decodiert typischerweise
jeden Anwendungsbefehl in eine Reihe von Basisbefehlen, so dass
diese Basisbefehle neuangeordnet und in der leistungsfähigsten Ausführungsreihenfolge
geplant werden können.
Dies erfordert, dass jede einzelne Basistätigkeit angesprochen und abgerufen
wird. Um die Neuanordnung zu bewerkstelligen, muss der Prozessor
fähig sein,
sicherzustellen, dass ein Basisbefehl, der Daten benötigt, die
sich aus anderen Basisbefehlen ergeben, ausgeführt wird, nachdem jener andere
Basisbefehl die benötigten
Daten erzeugt. Ein derartiger superskalarer Mikroprozessor muss
sicherstellen, dass zwei Basisbefehle, die gemeinsam ausgeführt werden,
nicht beide die gleichen Hardwarebetriebsmittel benötigen. Ein
derartiger Prozessor muss auch bedingte Verzweigungen auflösen, bevor
die Auswirkungen von Verzweigungstätigkeiten fertiggestellt werden
können.
-
Daher
benötigen
superskalare Mikroprozessoren eine umfangreiche Hardware, um die
Beziehungen der Basisbefehle zueinander zu vergleichen und die Abfolge
der Basisbefehle neuanzuordnen und zu planen, um jeden beliebigen
Befehl auszuführen.
Mit der Zunahme der Anzahl der Verarbeitungskanäle nehmen das Ausmaß und die
Kosten der Hardware zur Bewerkstelligung dieser superskalaren Beschleunigungstechniken ungefähr quadratisch
zu. Alle diese Hardwareanforderungen erhöhen die Komplexität und die
Kosten des beteiligten Schaltsystems. Wie bei der Behandlung von
Mikrobefehlen muss ein superskalarer Mikroprozessor jedes Mal, wenn
ein Anwendungsbefehl ausgeführt
wird, seine verhältnismäßig komplizierte
Ansprech- und Abrufhardware benutzen, um jeden dieser Basisbefehle
abzurufen, muss er diese Basisbefehle auf Basis der anderen Basisbefehle
und der Hardwareverwendung neuanordnen und neuplanen, und muss er
dann alle der neugeplanten Basisbefehle ausführen. Die Notwendigkeit, jeden
Anwendungsbefehl jedes Mal, wenn er ausgeführt wird, durch die gesamte
Hardwareabfolge laufen zu lassen, beschränkt die Geschwindigkeit, mit
der ein superskalarer Prozessor zur Ausführung seiner Befehle fähig ist.
-
Obwohl
diese verschiedenen Hardwaretechniken die Geschwindigkeit der Verarbeitung
erhöhen,
erhöht
zudem die Komplexität,
die mit der Bereitstellung derartiger Hardware verbunden ist, die
Kosten eines solchen Mikroprozessors deutlich. Zum Beispiel verwendet
der Prozessor i486 DX4 von Intel ungefähr 1,5 Millionen Transistoren.
Das Hinzufügen
der Hardware, die benötigt
wird, um das Prüfen
von Abhängigkeiten
und das Planen zu bewerkstelligen, das nötig ist, um Befehle in einem
grundlegenden superskalaren Mikroprozessor wie etwa dem Intel-Pentium® durch
zwei Kanäle
zu verarbeiten, erfordert die Verwendung von mehr als drei Millionen
Transistoren. Das Hinzufügen
der Hardware, um ein Neuanordnen unter Basisbefehlen, die von unterschiedlichen
Zielbefehlen erlangt werden, zu gestatten, eine spekulative Ausführung bereitzustellen,
eine Registerumbenennung zu gestatten, und eine Verzweigungsvorhersage
bereitzustellen, erhöht
die Anzahl der Transistoren im Intel-Pentium-ProTM-Mikroprozessor auf über sechs
Millionen. Daher ist ersichtlich, dass jede Hardwarehinzufügung zur
Erhöhung
der Betriebsgeschwindigkeit die Anzahl der Transistoren in den Mikroprozessoren
des neuesten Stands der Technik drastisch erhöht hat.
-
Selbst
das Verwenden dieser bekannten Techniken kann möglicherweise keinen Mikroprozessor
herstellen, der schneller als bestehende Mikroprozessoren ist, da
Hersteller die meisten der bekannten wirtschaftlich machbaren Techniken
verwenden, um den Betrieb bestehender Mikroprozessoren zu beschleunigen. Folglich
ist das Gestalten eines schnelleren Mikroprozessors eine sehr schwierige
und teure Aufgabe.
-
Das
Verringern der Kosten eines Prozessors ist ebenfalls sehr schwierig.
Wie oben erläutert
sind Hardwaretechniken, die einen ausreichend fähigen Prozessor erzeugen, sehr
teuer. Jemand, der einen neuen Prozessor gestaltet, muss die Einrichtungen
zur Herstellung der Hardware erhalten. Derartige Einrichtungen sind sehr
schwer zu erhalten, da Chiphersteller typischerweise kein Kapital
für kleine
Serien von Vorrichtungen aufwenden. Die Kapitalinvestition, die
nötig ist,
um eine Chipherstellungseinrichtung herzu stellen, ist so groß, dass
sie außerhalb
der Reichweite der meisten Firmen liegt.
-
Selbst
wenn man fähig
ist, einen neuen Prozessor zu gestalten, der alle der Anwendungsprogramme, die
für eine
Prozessorfamilie bestimmt sind, zumindest so schnell wie Konkurrenzprozessoren
ausführt,
enthält der
Preis von Konkurrenzprozessoren einen ausreichenden Gewinn, dass
jeglicher Mitbewerber sicherlich mit wesentlichen Preisnachlässen konfrontiert
werden wird.
-
Obwohl
das Gestalten eines Konkurrenzprozessors durch Erhöhen der
Komplexität
der Hardware sehr schwierig ist, war eine andere Weise, Anwendungsprogramme
(Zielanwendungsprogramme) auszuführen,
die für
eine bestimme Mikroprozessorfamilie (Zielmikroprozessoren) bestimmt
ist, den Zielmikroprozessor in Software an einem anderen schnelleren
Mikroprozessor (Hostmikroprozessor) zu emulieren. Dies ist ein zunehmend
billigeres Verfahren der Ausführung
dieser Programme, da es nur die Hinzufügung irgendeiner Form von Emulationssoftware
benötigt,
die das Anwendungsprogramm befähigt,
an einem schnelleren Mikroprozessor zu laufen. Die Emulatorsoftware
verändert
die Zielbefehle eines Anwendungsprogramms, das für die Zielprozessorfamilie
geschrieben wurde, in Hostbefehle, die zur Ausführung durch den Hostmikroprozessor
fähig sind.
Diese veränderten
Befehle werden dann unter Steuerung des Betriebssystems am schnelleren
Hostmikroprozessor ausgeführt.
-
Es
gab eine Anzahl von verschiedenen Gestaltungen, wodurch Zielanwendungen
an Hostcomputern mit schnelleren Prozessoren als den Prozessoren
der Zielcomputer ausgeführt
werden können.
Im Allgemeinen benutzen die Hostcomputer, die Zielprogramme unter
Verwendung von Emulationssoftware ausführen, Mikroprozessoren mit
reduziertem Befehlssatz (reduced instruction set computing, RISC),
da RISC-Prozes soren theoretisch einfacher sind und folglich schneller
als andere Arten von Prozessoren laufen können.
-
Doch
obwohl RISC-Computersysteme, die Emulatorsoftware ausführen, häufig fähig sind,
X86- (oder andere) Programme auszuführen, tun sie dies gewöhnlich mit
einer Geschwindigkeit, die wesentlich langsamer als die Geschwindigkeit
ist, mit der X86-Computersysteme des Stands der Technik das gleiche
Programm ausführen. Überdies
sind diese Emulatorprogramme häufig
nicht fähig,
alle oder eine große
Anzahl der verfügbaren
Zielprogramme auszuführen.
-
Die
Gründe,
warum Emulatorprogramme nicht fähig
sind, Zielprogramme so schnell wie die Zielmikroprozessoren auszuführen, sind
ziemlich kompliziert und erfordern ein gewisses Verständnis der
verschiedenen Emulationstätigkeiten. 1 enthält
eine Reihe von Diagrammen, die die unterschiedlichen Weisen darstellen,
auf die mehrere unterschiedliche Arten von Mikroprozessoren Zielanwendungsprogramme
ausführen.
-
In 1(a) ist ein typischer CISC-Mikroprozessor
wie etwa ein Intel-X86-Mikroprozessor gezeigt, der ein Zielanwendungsprogramm
ausführt,
das dazu bestimmt ist, an diesem Zielprozessor ausgeführt zu werden.
Wie ersichtlich ist, wird die Anwendung unter Verwendung eines CISC-Betriebssystems
(wie etwa MS DOS, Windows 3.1, Windows NT, und OS/2, die mit X86-Computern
verwendet werden), das dazu bestimmt ist, Schnittstellen bereitzustellen,
durch die Zugriff zur Hardware des Computers erlangt werden kann,
am CISC-Prozessor ausgeführt.
Typischerweise sind die Befehle des Anwendungsprogramms gewählt, um
die Vorrichtungen des Computers nur durch den Zugriff, der durch
das Betriebssystem bereitgestellt wird, zu benutzen. Dadurch erledigt
das Betriebssystem die Bedienungen, die Anwendungen einen Zugriff
auf den Speicher und die verschiedenen Ein-/Ausgabe-Vorrichtungen
des Computers gestatten. Der Zielcomputer enthält einen Speicher und Hardware,
die das Betriebssystem erkennt; und ein Aufruf von einer Zielanwendung
an das Betriebssystem verursacht, dass ein Betriebssystemgerätetreiber
das Stattfinden einer erwarteten Tätigkeit mit einer definierten
Vorrichtung des Zielcomputers verursacht. Die Befehle der Anwendung
werden am Prozessor ausgeführt,
wo sie zu Tätigkeiten
(die in Mikrocode oder den primitiveren Tätigkeiten, aus denen der Mikrocode
zusammengesetzt ist, verkörpert
sind) verändert
werden, zu deren Ausführung
der Prozessor fähig ist.
Wie oben beschrieben wurde, ruft der Befehl jedes Mal, wenn ein
komplizierter Zielbefehl ausgeführt
wird, das gleiche Unterprogramm auf, das als Mikrocode (oder als
der gleiche Satz von Basistätigkeiten)
gespeichert ist. Es wird immer das gleiche Unterprogramm ausgeführt. Wenn
der Prozessor superskalar ist, können
diese Basistätigkeiten
zur Ausführung
eines Zielbefehls häufig
durch den Prozessor neuangeordnet werden, neugeplant werden, und
unter Verwendung der verschiedenen Verarbeitungskanäle auf die
oben beschriebene Weise ausgeführt
werden; doch wird immer noch das Unterprogramm abgerufen und ausgeführt.
-
In 1(b) ist ein typischer RISC-Mikroprozessor
wie etwa ein PowerPC-Mikroprozessor, der in einem Apple-Macintosh-Computer
verwendet wird, dargestellt, der das gleiche Zielanwendungsprogramm
ausführt, das
zur Ausführung
am CISC-Prozessor von 1(a) bestimmt
ist. Wie ersichtlich ist, wird die Zielanwendung am Hostprozessor
unter Verwendung zumindest eines teilweisen Zielbetriebssystems
ausgeführt,
um auf einen Teil der Aufrufe zu reagieren, die die Zielanwendung
erzeugt. Typischerweise sind dies Aufrufe an die anwendungsartigen
Abschnitte des Zielbetriebssystems, die verwendet werden, um graphische
Schnittstellen an der Anzeige bereitzustellen, und an kurze Dienstprogramme,
die im Allgemeinen anwendungsartig sind. Die Zielanwendung und diese
Abschnitte des Zielbetriebssystems werden durch einen Softwareemulator
wie etwa einen Soft PC® verändert, der die Befehle, die
durch das Zielanwendungsprogramm und die anwendungsartigen Zielbetriebssystemprogramme
geliefert werden, in Befehle bricht, zu deren Ausführung der
Hostprozessor und sein Hostbetriebssystem fähig sind. Das Hostbetriebssystem
stellt die Schnittstellen bereit, durch die der Zugriff auf den
Speicher und die Ein-/Ausgabe-Hardware des RISC-Computers erlangt
werden kann.
-
Doch
der Host-RISC-Prozessor und die Hardwarevorrichtungen, die damit
in einem Host-RISC-Computer verbunden sind, sind gewöhnlich ziemlich
anders als die Vorrichtungen, die mit dem Prozessor verbunden sind,
für den
die Zielanwendung bestimmt war; und die verschiedenen Befehle, die
durch das Zielanwendungsprogramm bereitgestellt werden, sind dazu
bestimmt, beim Zugriff auf die verschiedenen Abschnitte des Zielcomputers
mit den Gerätetreibern
des Zielbetriebssystems zusammenzuwirken. Folglich muss das Emulationsprogramm,
das die Befehle des Zielanwendungsprogramms zu Basishostbefehlen
verändert,
zu deren Benutzung das Hostbetriebssystem fähig ist, die Tätigkeiten,
die dazu bestimmt sind, Hardwarevorrichtungen im Zielcomputer zu
betreiben, irgendwie mit Tätigkeiten
verknüpfen,
zu deren Ausführung
Hardwarevorrichtungen des Hostsystems fähig sind. Häufig erfordert dies, dass die
Emulatorsoftware virtuelle Vorrichtungen erzeugt, die auf die Befehle
der Zielanwendung reagieren, um Tätigkeiten auszuführen, zu
deren Ausführung das
Hostsystem unfähig
ist, da die Zielvorrichtungen nicht jene des Hostcomputers sind.
Manchmal muss der Emulator Verknüpfungen
von diesen virtuellen Vorrichtungen durch das Hostbetriebssystem
zu Hosthardwarevorrichtungen, die vorhanden sind, aber durch das
Hostbetriebssystem auf eine andere Weise angesprochen werden, erzeugen.
-
Zielprogramme
laufen aus einer Anzahl von Gründen
verhältnismäßig langsam,
wenn sie auf diese Weise ausgeführt
werden. Erstens muss jeder Zielbefehl von einem Zielanwendungsprogramm
und vom Zielbetriebssystem durch den Emulator zu den Hostbasisfunktionen
verändert
werden, die durch den Hostprozessor verwendet werden. Wenn die Zielanwendung
für eine
CISC-Maschine wie etwa einen X86 bestimmt ist, sind die Zielbefehle
von wechselnder Länge
und ziemlich kompliziert, so dass ihr Verändern zu Hostbasisbefehlen
ziemlich umständlich
ist. Die ursprünglichen
Zielbefehle werden zuerst decodiert, und die Abfolge der Basishostbefehle,
die die Zielbefehle aufbauen, wird bestimmt. Dann wird die Adresse
(oder werden die Adressen) jeder Abfolge von Basishostbefehlen bestimmt,
wird jede Abfolge der Basishostbefehle abgerufen, und werden diese
Basishostbefehle der Reihe nach oder nicht der Reihe nach ausgeführt. Die
große
Anzahl der Extraschritte, die durch einen Emulator benötigt werden,
um die Zielanwendungs- und Betriebssystembefehle zu Hostbefehlen,
die durch den Hostprozessor verstanden werden, zu verändern, muss
jedes Mal durchgeführt
werden, wenn ein Befehl ausgeführt
wird, und verlangsamt den Prozess der Emulation.
-
Zweitens
enthalten viele Zielbefehle Bezugnahmen auf Tätigkeiten, die durch bestimmte
Hardwarevorrichtungen durchgeführt
werden, welche im Zielcomputer auf eine bestimmte Weise funktionieren,
Hardware, die im Hostcomputer nicht verfügbar ist. Um die Tätigkeit
auszuführen,
muss die Emulationssoftware entweder durch das bestehende Hostbetriebssystem
Softwareverbindungen zu den Hardwarevorrichtungen des Hostcomputers
herstellen, oder muss die Emulatorsoftware eine virtuelle Hardwarevorrichtung
liefern. Das Emulieren der Hardware eines anderen Computers in Software
ist sehr schwierig. Die Emulationssoftware muss für jeden
der Zielanwendungsaufrufe an das Hostbetriebssystem virtuelle Vorrichtungen
erzeugen; und jede dieser virtuellen Vorrichtungen muss Aufrufe
an die tatsächlichen
Hostvorrichtungen bereitstellen. Das Emulieren einer Hardwarevorrichtung
erfordert, dass dann, wenn ein Zielbefehl die Vorrichtung verwenden soll,
der Code, der die virtuelle Vorrichtung darstellt, die durch diesen
Befehl benötigt wird,
aus dem Speicher abgerufen wird und ausgeführt wird, um die Vorrichtung
auszuführen.
Jedes dieser Verfahren zur Lösung
der Probleme fügt
der Ausführung
der Abfolge von Befehlen eine andere Reihe von Tätigkeiten hinzu.
-
Die
Anforderung, dass die Zielanwendung verschiedenste Ausnahmen vornimmt,
die durch die Hardware des Zielcomputers und das Zielbetriebssystem
ausgeführt
werden, damit das Computersystem arbeitet, verkompliziert das Problem
der Emulation. Wenn während
des Betriebs eines Zielcomputers eine Zielausnahme vorgenommen wird,
muss der Zustand des Computers zur Zeit der Ausnahme typischerweise
durch Aufrufen einer Mikrocodeabfolge, um die Tätigkeit zu bewerkstelligen,
gespeichert werden, muss das richtige Ausnahmebehandlungsprogramm
abgerufen werden, muss die Ausnahme behandelt werden, und muss dann
der richtige Punkt im Programm gefunden werden, um das Programm
fortzusetzen. Manchmal erfordert dies, dass das Programm am Punkt
der Vornahme der Ausnahme zum Zustand des Zielcomputers zurückkehrt,
und zu anderen Zeiten wird eine Verzweigung, die durch das Ausnahmebehandlungsprogramm
bereitgestellt wird, vorgenommen. In jedem Fall müssen die
Hardware und die Software des Zielcomputers, die benötigt werden, um
diese Tätigkeiten
zu bewerkstelligen, im Prozess der Emulation irgendwie bereitgestellt
werden. Da es für eine
richtige Ausführung
notwendig ist, dass zum Zeitpunkt einer jeglichen derartigen Ausnahme
der richtige Zielzustand verfügbar
ist, ist der Emulator gezwungen, diesen Zustand jederzeit genau
im Auge zu behalten, damit er fähig
ist, richtig auf diese Ausnahmen zu reagieren. Bei der herkömmlichen
Technik erforderte dies das Ausführen
jedes Befehls in der Reihenfolge, die durch die Zielanwendung bereitgestellt
wurde, da nur auf diese Weise der richtige Zielzustand aufrechterhalten
werden konnte.
-
Überdies
mussten Emulatoren des Stands der Technik aus anderen Gründen stets
die Reihenfolge der Ausführung
der Zielanwendung beibehalten. Zielbefehle können von zwei Arten sein, solche
die den Speicher betreffen, und solche, die eine speicherabgebildete
Ein-/Ausgabe(E/A)-Vorrichtung betreffen. Ohne den Versuch, einen
Befehl auszuführen,
gibt es keine Weise, zu wissen, ob eine Tätigkeit den Speicher oder eine
speicherabgebildete E/A-Vorrichtung betreffen soll. Wenn Befehle
am Speicher tätig
sind, ist ein Optimieren und Neuanordnen möglich und hilft es sehr bei
der Beschleunigung des Betriebs eines Systems. Doch Tätigkeiten, die
E/A-Vorrichtungen betreffen, müssen
ohne die Beseitigung jeglicher Schritte in der genauen Reihenfolge, in
der diese Tätigkeiten
programmiert sind, ausgeführt
werden, da sie ansonsten irgendeinen nachteiligen Einfluss auf den
Betrieb der E/A-Vorrichtung aufweisen können. Zum Beispiel kann eine
bestimmte E/A-Tätigkeit die
Auswirkung aufweisen, dass ein E/A-Register gelöscht wird. Wenn die Tätigkeiten
nicht der Reihe nach stattfinden, so dass ein Wert, der immer noch
nötig ist,
aus einem Register gelöscht
wird, kann das Ergebnis der Tätigkeit
anders als die durch den Zielbefehl befohlene Tätigkeit sein. Ohne ein Mittel,
um den Speicher von einer speicherabgebildeten E/A zu unterscheiden,
ist es nötig,
alle Befehle so zu behandeln, als ob sie die speicherabgebildete
E/A betreffen würden.
Dies beschränkt
die Natur der Optimierungen, die erzielbar sind, stark. Da Emulatoren
des Stands der Technik sowohl Mittel, um die Natur des angesprochenen
Speichers festzustellen, als auch Mittel, um sich von derartigen
Fehlern zu erholen, fehlen, müssen
sie der Reihe nach durch die Zielbefehle vorgehen, als ob jede Tätigkeit
die speicherabgebildete E/A betreffen würde. Dies beschränkt die
Möglichkeit
der Optimierung der Hostbefehle sehr.
-
Ein
anderes Problem, das die Fähigkeit
von Emulatoren des Stands der Technik, den Hostcode zu optimieren,
beschränkt,
wird durch selbstmodifizierenden Code verursacht. Wenn ein Zielbefehl
zu einer Abfolge von Hostbefehlen verändert wurde, die wiederum zurückschreiben,
um den ursprünglichen Zielbefehl
zu verändern,
sind die Hostbefehle nicht länger
gültig.
Folglich muss der Emulator ständig
prüfen,
um zu bestimmen, ob eine Speicherung in den Zielcodebereich erfolgt.
Alle diese Probleme machen diese Art von Emulation viel langsamer
als das Ausführen
einer Zielanwendung an einem Zielprozessor.
-
Ein
anderes Beispiel der Art von Emulationssoftware, die in 1(b) gezeigt ist, ist in einem Artikel
mit dem Titel „Talisman:
Fast and Accurate Multicomputer Simulation", R. C. Bedichek, Laboratory for Computer Sciences,
Massachusetts Institute of Technology, beschrieben. Dies ist ein
vollständigeres
Beispiel einer Übersetzung,
indem es ein vollständiges
Nachforschungssystem emulieren kann und das Nachforschungszielbetriebssystem
ausführen
kann. Talisman verwendet ein Host-UNIX-Betriebssystem.
-
In 1(c) ist ein anderes Beispiel einer Emulation
gezeigt. In diesem Fall ist ein PowerPC-Mikroprozessor, der in einem
Apple-Macintosh-Computer verwendet wird, dargestellt, der ein Zielanwendungsprogramm
ausführt,
das zur Ausführung
an CSIC-Prozessoren der Familie Motorola 68000 bestimmt war, die
in den ursprünglichen
Macintosh-Computern verwendet wurden; diese Art von Anordnung wurde
benötigt,
um zu gestatten, dass Apple-Vorläuferprogramme
an den Macintosh-Computern mit RISC-Prozessoren laufen. Wie ersichtlich
ist, wird die Zielanwendung am Hostprozessor unter Verwendung zumindest
eines teilweisen Zielbetriebssystems ausgeführt, um auf die anwendungsartigen
Abschnitte des Zielbetriebssystems zu reagieren. Ein Softwareemulator
bricht die Befehle, die durch das Zielanwendungsprogramm und die
anwendungsartigen Zielbetriebssystemprogramme geliefert werden,
in Befehle, zu deren Ausführung
der Hostprozessor und sein Hostbetriebssystem fähig sind. Das Hostbetriebssystem
stellt die Schnittstellen bereit, durch die der Zugriff auf den
Speicher und Ein-/Ausgabe-Hardware des Hostcomputers erlangt werden
kann.
-
Erneut
sind der Host-RISC-Prozessor und die damit verbundenen Vorrichtungen
im Host-RISC-Computer ziemlich anders als die Vorrichtungen, die
mit dem Motorola-CISC-Prozessor verbunden sind; und sind die verschiedenen
Zielbefehle dazu bestimmt, beim Zugriff auf die verschiedenen Abschnitte
des Zielcomputers mit dem Ziel-CISC-Betriebssystem zusammenzuwirken.
Folglich muss das Emulationsprogramm die Tätigkeiten, die dazu bestimmt
sind, Hardwarevorrichtungen im Zielcomputer zu betreiben, mit Tätigkeiten
verknüpfen,
zu deren Ausführung
die Hardwarevorrichtungen des Hostsystems fähig sind. Dies erfordert, dass der
Emulator virtuelle Vorrichtungen in Software erzeugt, die auf die
Befehle der Zielanwendung reagieren, und dass er Verknüpfungen
von diesen virtuellen Vorrichtungen durch das Hostbetriebssystem
zu Hosthardwarevorrichtungen erzeugt, die vorhanden sind, aber durch
das Hostbetriebssystem auf eine andere Weise angesprochen werden.
-
Die
Zielsoftware, die auf diese Weise ausgeführt wird, läuft aus den gleichen Gründen, aus
denen die Emulation von 1(b) langsam
läuft,
verhältnismäßig langsam.
Erstens muss jeder Zielbefehl von der Zielanwendung und vom Zielbetriebssystem
durch Abrufen des Befehls verändert
werden; und alle der Hostbasisfunktionen, die aus diesen Befehlen
erlangt werden, müssen
jedes Mal, wenn der Befehl ausgeführt wird, der Reihe nach ausgeführt werden.
Zweitens muss die Emulationssoftware für jeden der Zielanwendungsaufrufe an
das Hostbetriebssystem virtuelle Vorrichtungen erzeugen; und jede
dieser virtuellen Vorrichtungen muss Aufrufe an die tatsächlichen
Hostvorrichtungen bereitstellen. Drittens muss der Emulator alle
Befehle so konservativ behandeln, wie er Befehle behandelt, die
an speicherabgebildete E/A-Vorrichtungen
gerichtet sind, oder Gefahr laufen, Ausnahmen zu erzeugen, von denen
er sich nicht erholen kann. Schließlich muss der Emulator zu
jeder Zeit den richtigen Zielzustand aufrechterhalten und müssen Speichertätigkeiten
stets vorwärts
prüfen,
ob eine Speicherung in den Zielcodebereich erfolgt. Alle diese Anforderungen
beseitigen die Fähigkeit
des Emulators, eine bedeutende Optimierung des Codes, der am Hostprozessor
ausgeführt
wird, auszuführen,
und machen diese Art von Emulation viel langsamer als das Ausführen der
Zielanwendung an einem Zielprozessor. Emulationsgeschwindigkeiten
von weniger als einem Viertel der Schnelligkeit von Prozessoren des
Stands der Technik werden als sehr gut angesehen. Im Allgemeinen
hat dies diese Art von Emulationssoftware auf Verwendungen verwiesen,
bei denen die Fähigkeit
der Ausführung
von Anwendungen, die für
einen anderen Prozessor bestimmt sind, nützlich, aber nicht hauptsächlich ist.
-
In 1(d) ist ein bestimmtes Verfahren der
Emulation eines Zielanwendungsprogramms an einem Hostprozessor veranschaulicht,
das für
eine sehr begrenzte Reihe von Zielanwendungen eine verhältnismäßig gute
Leistung bereitstellt. Die Zielanwendung liefert Befehle an einen
Emulator, der diese Befehle zu Befehlen für den Hostprozessor und das
Hostbetriebssystem verändert.
Der Hostprozessor ist ein Alpha-RISC-Prozessor der Digital Equipment
Corporation, und das Hostbetriebssystem ist Microsoft NT. Die einzigen
Zielanwendungen, die durch dieses System ausgeführt werden können, sind
32-Bit-Anwendungen, die dazu bestimmt sind, durch einen Ziel-X86-Prozessor
mit einem Windows-Win32skonformen Betriebssystem ausgeführt zu werden.
Da das Host- und
das Zielbetriebssystem beinahe identisch sind und dazu gestaltet
sind, diese gleichen Befehle zu behandeln, kann die Emulatorsoftware
die Befehle sehr leicht verändern. Überdies
ist das Hostbetriebssystem bereits dazu gestaltet, auf die gleichen
Aufrufe anzusprechen, die die Zielanwendung erzeugt, weshalb die
Erzeugung von virtuellen Vorrichtungen beträchtlich verringert ist.
-
Obwohl
dies technisch ein Emulationssystem ist, das eine Zielanwendung
an einem Hostprozessor ausführt,
ist es ein sehr besonderer Fall. Hier läuft die Emulationssoftware
an einem Hostbetriebssystem, das bereits dazu gestaltet ist, ähnliche
Anwendungen auszuführen.
Dies gestattet, dass die Aufrufe von den Zielanwendungen einfacher
zu den richtigen Einrichtungen des Hosts und des Hostbetriebssystems
gerichtet werden. Noch wichtiger wird dieses System nur 32-Bit-Windows-Anwendungen
ausführen,
die vermutlich weniger als ein Prozent aller X86-Anwendungen ausmachen. Überdies
wird dieses System Anwendungen an nur einem Betriebssystem, Windows
NT, ausführen,
während
X86-Prozessoren Anwendungen ausführen,
die für eine
große
Anzahl von Betriebssystemen bestimmt sind. Ein derartiges System
könnte
daher innerhalb der Begriffe, die früher in dieser Beschreibung
ausgedrückt
wurden, als nicht kompatibel angesehen werden. Daher kann ein Prozessor,
der einen derartigen Emulator ausführt, nicht als ein Konkurrenz-X86-Prozessor
betrachtet werden.
-
Ein
anderes Verfahren der Emulation, wodurch Software verwendet werden
kann, um Abschnitte von Anwendungen, die für einen ersten Befehlssatz
geschrieben wurden, an einem Computer auszuführen, der einen unterschiedlichen
Befehlssatz erkennt, ist in 1(e) veranschaulicht.
Diese Form von Emulationssoftware wird typischerweise durch einen
Programmierer verwendet, der möglicherweise
eine Anwendung von einem Computersystem zu einem anderen portiert.
Typischerweise ist die Zielanwendung für irgendeinen anderen Zielcomputer
als die Hostmaschine, an der der Emulator ausgeführt wird, bestimmt. Die Emulatorsoftware
analysiert die Zielbefehle, übersetzt
diese Befehle in Befehle, die an der Hostmaschine ausgeführt werden
können, und
puffert diese Hostbefehle, damit sie wiederverwendet werden können. Diese
dynamische Übersetzung und
Pufferung gestattet, dass Abschnitte von Anwendungen sehr schnell
ausgeführt
werden. Diese Form von Emulator wird normalerweise mit Softwareüberwachungswerkzeugen
verwendet, um ausführliche
Informationen über
das Verhalten eines Zielprogramms, das ausgeführt wird, bereitzustellen.
Die Ausgabe eines Überwa chungswerkzeugs
kann wiederum verwendet werden, um ein Analysatorprogramm zu betreiben,
das die Überwachungsinformationen
analysiert.
-
Um
zu bestimmen, wie der Code tatsächlich
funktioniert, läuft
ein Emulator dieser Art, unter anderem, mit dem Hostbetriebssystem
an der Hostmaschine, liefert er die virtuelle Hardware, die das
Hostbetriebssystem nicht bereitstellt, und bildet er ansonsten die
Tätigkeiten
des Computers, für
den die Anwendung bestimmt war, auf die Hardwarebetriebsmittel der
Hostmaschine ab, um die Tätigkeiten
des Programms, das ausgeführt wird,
auszuführen.
Diese Softwarevirtualisierung von Hardware und die Abbildung auf
den Hostcomputer kann sehr langsam und unvollständig sein.
-
Da überdies
häufig
mehrere Hostbefehle erforderlich sind, um einen der Zielbefehle
auszuführen,
können
Ausnahmen einschließlich
Fehlern und Fallen, die ein Zielbetriebssystem-Ausnahmebehandlungsprogramm
erfordern, erzeugt werden und den Host veranlassen, die Verarbeitung
der Hostbefehle an einem Punkt einzustellen, der nicht mit Zielbefehlsgrenzen
in Zusammenhang steht. Wenn dies geschieht, kann es unmöglich sein,
die Ausnahme richtig zu behandeln, da der Zustand des Hostprozessors
und des Speichers unrichtig ist. Wenn dies der Fall ist, muss der
Emulator angehalten und erneut ausgeführt werden, um die Tätigkeiten,
die die Ausnahme erzeugten, zu überwachen.
Obwohl ein derartiger Emulator Abfolgen des Zielcodes sehr schnell
ausführen
kann, weist er daher kein Verfahren auf, um sich von diesen Ausnahmen
zu erholen, weshalb er keinen bedeutenden Abschnitt einer Anwendung
schnell ausführen
kann.
-
Dies
ist bei dieser Form von Emulator kein besonderes Problem, da die
Funktionen, die durch die Emulatoren, Überwachungen, und die zugehörigen Analysatoren
durchgeführt
werden, auf das Erzeugen neuer Programme oder das Portieren alter
Programme zu einer anderen Maschine gerichtet sind, weshalb die
Geschwindigkeit, mit der die Emulatorsoftware läuft, selten entscheidend ist.
Das heißt,
ein Programmierer ist gewöhnlich
nicht daran interessiert, wie schnell der Code, der durch einen
Emulator erzeugt wird, an der Hostmaschine läuft, sondern daran, ob der
Emulator einen Code erzeugt, der an der Maschine, für die er
bestimmt ist, ausführbar
ist, und der an dieser Maschine schnell laufen wird. Folglich stellt
diese Art von Emulationssoftware kein Verfahren bereit, um Anwendungsprogramme,
die in einem ersten Befehlssatz geschrieben sind, für andere
als Programmierzwecke zum Lauf an einer anderen Art von Mikroprozessor
auszuführen.
Ein Beispiel für
diese Art von Emulationssoftware ist in einem Artikel mit dem Titel „Shade:
A Fast Instruction-Set Simulator für Execution Profiling", Cmelik und Keppel,
beschrieben.
-
Es
ist erwünscht,
Konkurrenzmikroprozessoren bereitzustellen, die schneller und billiger
als Mikroprozessoren des Stands der Technik sind, aber mit Zielanwendungsprogrammen,
die für
Mikroprozessoren des Stands der Technik bestimmt sind, welche jegliche
für diese
Mikroprozessoren verfügbaren
Betriebssysteme ausführen,
völlig
kompatibel sind.
-
Genauer
ist erwünscht,
einen Hostprozessor bereitzustellen, der ein Schaltsystem zur Steigerung
der Geschwindigkeit, mit der der Prozessor arbeitet, aufweist.
-
US-A-5,926,832
offenbart einen Speicherpuffer zur Verwendung mit mehreren Mikroprozessoren.
Der Puffer beinhaltet einen Speicherdatenspeicher und einen Speicher
für eine
Speicheradresse, die den Speicherdaten entspricht. Es sind Mittel
bereitgestellt, um die Übereinstimmung
zwischen den Daten, die im Puffer gespeichert sind, und den Daten,
die im Speicher gespeichert sind, sicherzustellen.
-
Kurzdarstellung
der Erfindung
-
Es
ist daher eine Aufgabe der vorliegenden Erfindung, den Betrieb eines
Mikroprozessors mit einer Vorrichtung zur Beschleunigung der Ausführung von
Programmen zu verbessern.
-
Die
Erfindung erstreckt sich auf eine Speichersteuerung nach Anspruch
1; einen Mikroprozessor nach Anspruch 7; und ein Verfahren zum Steigern
der Geschwindigkeit eines Prozessors nach Anspruch 9.
-
Diese
und andere Aufgaben und Merkmale der Erfindung werden durch Bezugnahme
auf die folgende ausführliche
Beschreibung, die zusammen mit den Zeichnungen herangezogen wird,
in denen gleiche Elemente über
die mehreren Ansichten hinweg durch gleiche Bezeichnungen bezeichnet
sind, besser verstanden werden.
-
Kurze Beschreibung
der Zeichnungen
-
1(a) bis (e) sind Diagramme, die die Weise
des Betriebs von Mikroprozessoren veranschaulichen, die nach dem
Stand der Technik gestaltet sind.
-
2 ist
ein Blockdiagramm eines Mikroprozessors, der nach der vorliegenden
Erfindung gestaltet ist und eine Anwendung ausführt, die für einen anderen Mikroprozessor
bestimmt ist.
-
3 ist
ein Diagramm, das einen Abschnitt des in 2 gezeigten
Mikroprozessors veranschaulicht.
-
4 ist
ein Blockdiagramm, das eine Registerdatei veranschaulicht, die in
einem Mikroprozessor verwendet wird, der nach der vorliegenden Erfindung
gestaltet ist.
-
5 ist
ein Blockdiagramm, das einen torgesteuerten Speicherungspuffer veranschaulicht,
der nach der vorliegenden Erfindung gestaltet ist.
-
6(a) bis (c) veranschaulichen Befehle,
die in verschiedenen Mikroprozessoren des Stands der Technik und
in einem Mikroprozessor, der nach der vorliegenden Erfindung gestaltet
ist, verwendet werden.
-
7 veranschaulicht
ein Verfahren, das durch einen Softwareabschnitt eines Mikroprozessors,
der nach der vorliegenden Erfindung gestaltet ist, ausgeführt wird.
-
8 veranschaulicht
ein anderes Verfahren, das durch einen Softwareabschnitt eines Mikroprozessors,
der nach der vorliegenden Erfindung gestaltet ist, ausgeführt wird.
-
9 ist
ein Blockdiagramm, das ein verbessertes Computersystem veranschaulicht.
-
10 ist
ein Blockdiagramm, das einen Abschnitt des in 3 gezeigten
Mikroprozessors veranschaulicht.
-
11 ist ein Blockdiagramm, das einen im Mikroprozessor
von 3 gezeigten Lookaside-Übersetzungspuffer ausführlicher
veranschaulicht.
-
12 ist ein Blockdiagramm, das ein Speicherreplizierungsschaltsystem
nach der vorliegenden Erfindung ausführlicher veranschaulicht.
-
Bezeichnungen
und Benennungen
-
Einige
Abschnitte der ausführlichen
Beschreibungen, die folgen, werden in Form von symbolischen Darstellungen
von Tätigkeiten
an Datenbits in einem Computerspeicher geboten. Diese Beschreibungen
und Darstellungen sind die Mittel, die durch Fachleute auf dem Gebiet
der Datenverarbeitung verwendet werden, um das Wesen ihrer Arbeit
anderen Fachleuten am leistungsfähigsten
zu übermitteln.
Die Tätigkeiten
sind jene, die physische Handhabungen von physikalischen Größen benötigen. Gewöhnlich,
aber nicht notwendigerweise, nehmen diese Größen die Form von elektrischen
oder magnetischen Signalen an, die fähig sind, gespeichert, übertragen,
kombiniert, verglichen und anderweitig behandelt zu werden. Es hat
sich zeitweise, hauptsächlich
aus Gründen
der gebräuchlichen
Verwendung, als bequem erwiesen, diese Signale als Bits, Werte,
Elemente, Symbole, Zeichen, Ausdrücke, Zahlen, oder dergleichen
zu bezeichnen. Es sollte jedoch im Gedächtnis behalten werden, dass
alle diese und ähnliche
Ausdrücke
mit den passenden physikalischen Größen verbunden werden müssen und
nur bequeme Bezeichnungen sind, die auf diese Größen angewendet werden.
-
Ferner
werden die durchgeführten
Bearbeitungen häufig
mit Ausdrücken
wie etwa „Addieren" oder „Vergleichen" bezeichnet, die üblicherweise
mit geistigen Tätigkeiten
verbunden sind, welche durch eine menschliche Bedienungsperson durchgeführt werden.
In den meisten Fällen
ist in jeglicher der hierin beschriebenen Tätigkeiten, die einen Teil der
vorliegenden Erfindung bilden, keine derartige Fähigkeit einer menschlichen
Bedienungsperson nötig
oder erwünscht;
die Tätigkeiten
sind Maschinentätigkeiten.
Nützliche
Maschinen zur Durchführung
der Tätigkeiten
der vorliegenden Erfindung beinhalten Allzweck-Digitalcomputer oder andere ähnliche
Vorrichtungen. In allen Fällen
sollte die Unterscheidung zwischen den Verfahrenstätigkeiten beim
Betreiben eines Computers und dem Verfahren der Berechnung selbst
im Gedächtnis
behalten werden. Die vorliegende Erfindung betrifft ein Verfahren
und eine Vorrichtung zum Betreiben eines Computers beim Verarbeiten
elektrischer oder anderer (z.B. mechanischer, chemischer) physikalischer
Signale, um andere gewünschte
physikalische Signale zu erzeugen.
-
Während der
folgenden Beschreibung wird das Zielprogramm in manchen Fällen als
ein Programm bezeichnet, das dazu bestimmt ist, an einem X86-Mikroprozessor
ausgeführt
zu werden, um beispielhafte Einzelheiten des Betriebs bereitzustellen,
da die Mehrheit der Emulatoren X86-Anwendungen ausführt. Das
Zielprogramm kann jedoch ein Programm sein, das dazu bestimmt ist,
an jeder beliebigen Familie von Zielcomputern zu laufen. Dies beinhaltet
virtuelle Zielcomputer wie etwa Pcode-Maschinen, Postscript-Maschinen,
oder virtuelle Java-Maschinen.
-
Ausführliche
Beschreibung
-
Die
vorliegende Erfindung hilft, die Probleme des Stands der Technik
zu überwinden
und einen Mikroprozessor bereitzustellen, der schneller als Mikroprozessoren
des Stands der Technik ist, fähig
ist, die ganze Software für
alle Betriebssysteme, die durch eine große Anzahl von Familien von
Mikroprozessoren des Stands der Technik ausgeführt werden können, auszuführen, aber
weniger teuer als Mikroprozessoren des Stands der Technik ist.
-
Anstatt
einen Mikroprozessor mit einer komplizierteren Hardware zu verwenden,
um seine Tätigkeit
zu beschleunigen, ist die vorliegende Erfindung ein Teil einer Kombination,
die einen verbesserten Hardwareverarbeitungsabschnitt (in dieser
Beschreibung als „Formungshost" bezeichnet), der
viel einfacher als Mikroprozessoren des Stands der Technik ist,
und einen emulierenden Softwareabschnitt (in dieser Beschreibung
als „Codeformungssoftware" bezeichnet) auf
eine solche Weise beinhaltet, dass die beiden Abschnitte gemeinsam
als ein Mikroprozessor mit mehr Fähigkeiten als jeder beliebige
bekannte Konkurrenzmikroprozessor arbeiten. Genauer ist ein Formungshost
ein Prozessor, der Hardwareverbesserungen beinhaltet, um dabei zu helfen,
den Zustand eines Zielcomputers sofort greifbar zu haben, wenn eine
Ausnahme oder ein Fehler auftritt, während eine Codefor mungssoftware
Software ist, die die Befehle eines Zielprogramms in Formungshostbefehle
für den
Formungshost übersetzt
und durch Ersetzen des Arbeitszustands mit dem richtigen Zielzustand,
wenn dies nötig
ist, auf Ausnahmen und Fehler reagiert, so dass es zu richtigen
Neuübersetzungen kommt.
Die Codeformungssoftware kann auch verschiedene Prozesse zur Verbesserung
der Verarbeitungsgeschwindigkeit beinhalten. Anstatt Hardware bereitzustellen,
um die Verarbeitungsgeschwindigkeit zu verbessern, wie dies alle
der sehr schnellen Mikroprozessoren des Stands der Technik tun,
gestattet der verbesserte Mikroprozessor, dass durch die Codeformungssoftware
eine große
Anzahl von Beschleunigungsverbesserungsschritten in wählbaren
Stufen ausgeführt
wird. Das Bereitstellen der Geschwindigkeitsverbesserungstechniken
in der Codeformungssoftware gestattet, dass der Formungshost unter
Verwendung viel weniger komplizierter Hardware ausgeführt wird,
was schneller und wesentlich weniger teuer als die Hardware von
Mikroprozessoren des Stands der Technik ist. Als ein Vergleich ist
eine Ausführungsform,
die die vorliegende Erfindung enthält und dazu bestimmt ist, alle
verfügbaren
X86-Anwendungen auszuführen,
durch einen Formungshost ausgeführt,
der ungefähr
ein Viertel der Anzahl der Tore des Pentium-Pro-Mikroprozessors
aufweist, aber X86-Anwendungen wesentlich schneller ausführt, als
der Pentium-Pro-Mikroprozessor oder jeder beliebige andere bekannte
Mikroprozessor, der zur Ausführung
dieser Anwendungen fähig
ist.
-
Die
Codeformungssoftware benutzt bestimmte Techniken, die früher nur
von Programmierern verwendet wurden, die neue Software gestalten
oder neue Hardware emulieren. Der Formungshost beinhaltet Hardwareverbesserungen,
die besonders dazu geeignet sind, zu gestatten, dass die Beschleunigungstechniken, die
durch die Codeformungssoftware bereitgestellt werden, leistungsfähig benutzt
werden. Diese Hardwareverbesserungen gestatten, dass die Codeformungssoftware
Beschleunigungstechniken über
einen weiteren Bereich von Befehlen ausführt. Diese Hardwareverbesserungen
erlauben auch, dass durch die Codeformungssoftware zusätzliche
Beschleunigungstechniken ausgeführt
werden, die in Hardwareprozessoren nicht verfügbar sind und in jenen Prozessoren,
außer
zu einem unerschwinglichen Preis, nicht ausgeführt werden konnten. Diese Techniken
erhöhen
die Geschwindigkeit des Mikroprozessors, der die vorliegende Erfindung beinhaltet,
verglichen mit den Geschwindigkeiten von Mikroprozessoren des Stands
der Technik, die die Ausführung
von nativen Befehlssätzen
ausüben,
deutlich.
-
Zum
Beispiel gestattet die Codeformungssoftware in Kombination mit dem
verbesserten Formungshost die Verwendung von Techniken, die die
Neuanordnung und Neuplanung von Basisbefehlen, welche durch eine
Abfolge von Zielbefehlen erzeugt werden, gestattet, ohne das Hinzufügen bedeutender
Schaltsysteme zu erfordern. Durch das Gestatten der Neuanordnung
und der Neuplanung einer Anzahl von Zielbefehlen gemeinsam können andere
Optimierungstechniken verwendet werden, um die Anzahl der Prozessorschritte,
die nötig sind,
um eine Gruppe von Zielbefehlen auszuführen, auf weniger als jene
zu verringern, die durch andere Mikroprozessoren, welche die Zielanwendungen
ausführen
werden, benötigt
werden.
-
Die
Codeformungssoftware in Kombination mit dem verbesserten Formungshost übersetzt
Zielbefehle schnell in Befehle für
den Formungshost und puffert diese Hostbefehle in einer Speicherdatenstruktur
(in dieser Beschreibung als ein „Übersetzungspuffer" bezeichnet). Die
Verwendung eines Übersetzungspuffers,
um übersetzte
Befehle zu halten, gestattet, dass Befehle abgerufen werden können, ohne
jedes Mal, wenn jeder Zielbefehl ausgeführt wird, den langen Prozess
des Bestimmens, welche Basisbefehle benötigt werden, um jeden Zielbefehl
auszuführen,
des Ansprechens jedes Basisbefehls, des Abrufens jedes Basisbefehls,
des Optimierens der Abfolge von Basisbefehlen, des Zuteilens von
Mitteln an jeden Basisbefehl, des Neuanordnens der Basisbe fehle,
und des Ausführens
jedes Schritts jeder Abfolge von beteiligten Basisbefehlen neu auszuführen. Sobald
ein Zielbefehl übersetzt
wurde, kann er ohne die Notwendigkeit für jeglichen dieser unzähligen Schritte
aus dem Übersetzungspuffer
abgerufen und ausgeführt
werden.
-
Ein
Hauptproblem von Emulationstechniken des Stands der Technik war
die Unfähigkeit
dieser Techniken, Ausnahmen, die während der Ausführung eines
Zielprogramms erzeugt wurden, mit gutem Leistungsvermögen zu behandeln.
Dies ist besonders für
Ausnahmen zutreffend, die beim Ausführen der Zielanwendung erzeugt
werden und auf das Zielbetriebssystem gerichtet sind, wobei zur
Zeit jeder derartigen Ausnahme für
die richtige Ausführung
der Ausnahme und der Befehle, die folgen, der richtige Zielzustand
verfügbar
sein muss. Folglich ist der Emulator gezwungen, den Zielzustand
zu jeder Zeit genau zu beobachten, und muss er ständig prüfen, um
zu bestimmen, ob eine Speicherung in den Zielcodebereich erfolgt.
Andere Ausnahmen erzeugen ähnliche
Probleme. Zum Beispiel können
durch den Emulator Ausnahmen erzeugt werden, um bestimmte Zieltätigkeiten
festzustellen, die durch irgendeine bestimmte Hostfunktion ersetzt
wurden. Im Besonderen können
verschiedene Hardwaretätigkeiten
eines Zielprozessors durch Softwaretätigkeiten ersetzt werden, die
durch die Emulatorsoftware bereitgestellt werden. Zusätzlich kann
auch der Hostprozessor, der die Hostbefehle, die von den Zielbefehlen
erlangt werden, ausführt,
Ausnahmen erzeugen. Alle diese Ausnahmen können entweder während des
Versuchs, Zielbefehle durch den Emulator zu Hostbefehlen zu verändern, oder bei
der Ausführung
der Hostübersetzungen
am Hostprozessor auftreten. Eine leistungsfähige Emulation muss irgendeine
Weise bereitstellen, um sich leistungsfähig und auf eine solche Weise,
dass die Ausnahme richtig behandelt werden kann, von diesem Ausnahmen
zu erholen. Nichts des Stands der Technik tut dies für die gesamte
Software, die emuliert werden könnte.
-
Um
diese Beschränkungen
des Stands der Technik zu überwinden,
ist im verbesserten Formungshost eine Anzahl von Hardwareverbesserungen
beinhaltet. Diese Verbesserungen beinhalten einen torgesteuerten Speicherungspuffer
und eine große
Anzahl von zusätzlichen
Prozessorregistern. Einige der zusätzlichen Register gestatten
die Verwendung einer Registerumbenennung, um das Problem von Befehlen,
die die gleichen Hardwarebetriebsmittel benötigen, zu verringern. Die zusätzlichen
Register gestatten auch die Unterhaltung eines Satzes von Host-
oder Arbeitsregistern, um die Host- befehle zu verarbeiten, und eines Satzes
von Zielregistern, um den offiziellen Zustand des Zielprozessors,
für den
die Zielanwendung geschaffen wurde, zu halten. Die Ziel- (oder Schatten-)register
sind durch eine fest zugeordnete Schnittstelle, die eine als „Übergeben" bezeichnete Tätigkeit
gestattet, um den Inhalt aller Arbeitsregister schnell zu offiziellen
Zielregistern zu übertragen,
und eine als „Rückführung" bezeichnete Tätigkeit
gestattet, um den Inhalt aller offiziellen Zielregister zu ihren
Arbeitsregisteräquivalenten
zurück
zu übertragen,
mit ihren Arbeitsregisteräquivalenten
verbunden. Der torgesteuerte Speicherungspuffer speichert Arbeitsspeicherzustandsveränderungen
an einer „nichtübergebenen" Seite eines Hardwaretors" und Zustandsveränderungen
des offiziellen Speichers an einer „übergebenen" Seite des Hardwaretors, an der diese übergebenen
Speicherungen zum Hauptspeicher „ablaufen". Eine Übergabetätigkeit überträgt Speicherungen von der nicht-übergebenen Seite des Tors zur übergebenen Seite
des Tors. Die zusätzlichen
offiziellen Register und der torgesteuerte Speicherungspuffer gestatten,
dass der Zustand des Speichers und der Zustand der Zielregister
gemeinsam aktualisiert werden, sobald einer oder eine Gruppe von
Zielbefehlen übersetzt
und ohne Fehler ausgeführt
wurde.
-
Diese
Aktualisierungen werden durch die Codeformungssoftware so gewählt, dass
sie an integralen Zielbefehlsgrenzen stattfinden. Daher werden,
wenn die Basishostbefehle, die eine Übersetzung einer Reihe von
Zielbefehlen bilden, durch den Hostprozessor ausgeführt werden,
ohne Ausnahmen zu erzeugen, die Arbeitsspeicherspeicherungen und
der Arbeitsregisterzustand, die durch diese Befehle erzeugt werden,
zum offiziellen Speicher und zu den offiziellen Zielregistern übertragen.
Auf diese Weise kann der ursprüngliche
Zustand in den Zielregistern bei der letzten Aktualisierung (oder Übergabe)
in die Arbeitsregister abgerufen werden und können nichtübergebene Speicherspeicherungen
im torgesteuerten Speicherungspuffer verworfen werden, wenn bei
der Verarbeitung des Hostbefehle eine Ausnahme an einem Punkt auftritt,
der sich nicht an der Grenze eines oder eines Satzes von übersetzten
Zielbefehlen befindet. Falls die erzeugte Ausnahme eine Zielausnahme
ist, können
dann die Zielbefehle, die die Zielausnahme verursachen, einer nach
dem anderen neuübersetzt
werden und in einer seriellen Abfolge ausgeführt werden, wie sie durch einen
Zielmikroprozessor ausgeführt
würden.
Wenn jeder Zielbefehl ohne Fehler richtig ausgeführt wird, kann der Zustand
der Zielregister aktualisiert werden; und können die Daten im Speicherungspuffer
zum Speicher durchgelassen werden. Dann, wenn die Ausnahme beim
Ausführen
der Hostbefehle erneut auftritt, wird der richtige Zustand des Zielcomputers
durch die Zielregister des Formungshosts und des Speichers gehalten;
und kann die Tätigkeit
ohne Verzögerung
richtig behandelt werden. Jene neue Übersetzung, die durch dieses
berichtigende Übersetzen erzeugt
wird, kann zur zukünftigen
Verwendung gepuffert werden, wie sie übersetzt ist, oder kann alternativ
für ein
einmaliges oder seltenes Ereignis wie etwa einen Seitenfehler verworfen
werden. Dies gestattet, dass der Mikroprozessor, der durch die Kombination
aus der Codeformungssoftware und dem Formungshost erzeugt wird,
die Befehle schneller als Prozessoren ausführt, für die die Software ursprünglich geschrieben
wurde.
-
Es
sollte bemerkt werden, dass bei der Ausführung von Zielprogrammen unter
Verwendung des Mikroprozessors, der die vorliegende Erfindung beinhaltet,
viele unterschiedliche Arten von Ausnahmen auftreten können, die
auf verschiedene Weisen behandelt werden. Zum Beispiel werden einige
Ausnahmen durch die Zielsoftware verursacht, die eine Ausnahme erzeugt,
welche ein Zielbetriebssystem-Ausnahmebehandlungsprogramm benutzt.
Die Verwendung eines derartigen Ausnahmebehandlungsprogramms erfordert,
dass die Codeformungssoftware Programme beinhaltet, um den gesamten
Ausnahmebehandlungsprozess einschließlich jeglicher Hardware, die
durch den Zielcomputer bereitgestellt wird, um den Prozess zu behandeln, zu
emulieren. Dies erfordert, dass die Codeformungssoftware für das Speichern
des Zustands des Zielprozessors sorgt, damit sie nach der Behandlung
der Ausnahme richtig fortsetzen kann. Einige Ausnahmen wie ein Seitenfehler,
die das Abrufen von Daten in eine neue Speicherseite erfordern,
bevor der Prozess, der übersetzt wird,
ausgeführt
werden kann, erfordern eine Rückkehr
zum Beginn des Prozesses der übersetzt
wird, nachdem die Ausnahme behandelt wurde. Andere Ausnahmen führen eine
bestimmte Tätigkeit
in Software aus, wo diese Tätigkeit
nicht durch die Hardware bereitgestellt ist. Diese erfordern, dass
das Ausnahmebehandlungsprogramm die Tätigkeit zum nächsten Schritt
in der Übersetzung
zurückführt, nachdem
die Ausnahme behandelt wurde. Jede dieser unterschiedlichen Arten
von Ausnahmen kann durch den Mikroprozessor, der die vorliegende
Erfindung beinhaltet, leistungsfähig
behandelt werden.
-
Zusätzlich werden
einige Ausnahmen durch Hosthardware erzeugt und stellen eine Vielfalt
von Host- und Zielbedingungen fest. Einige Ausnahmen verhalten sich
wie Ausnahmen an einem herkömmlichen
Mikroprozessor, doch andere werden durch die Codeformungssoftware
verwendet, um das Versagen verschiedener Spekulationen festzustellen.
In diesen Fällen
verursacht die Codeformungssoftware unter Verwendung der oben beschriebenen
Zustandsspeicherungs- und -wiederherstellungsmechanismen, dass der
Zielzustand zu seiner jüng sten
offiziellen Version wiederhergestellt wird, und erzeugt und speichert
sie eine neue Übersetzung (oder
verwendet sie eine früher
erzeugte und sichere Übersetzung
erneut), die die gescheiterte Spekulation vermeidet. Diese Übersetzung
wird dann ausgeführt.
-
Der
Formungshost beinhaltet zusätzliche
Hardwareausnahmenfeststellungsmechanismen, die in Verbindung mit
dem oben beschriebenen Rückführungs-
und Neuübersetzungsverfahren
eine weitere Optimierung gestatten. Beispiele sind ein Mittel zur
Unterscheidung des Speichers und der speicherabgebildeten E/A und
ein Mittel zur Beseitigung von Speicherbezugnahmen durch Schützen von
Adressen oder Adressbereichen, wodurch gestattet wird, dass Zielvariablen
in Registern gehalten werden.
-
Falls
Ausnahmen verwendet werden, um das Versagen anderer Spekulationen
festzustellen, wie etwa, ob eine Tätigkeit den Speicher oder die
speicherabgebildete E/A betrifft, wird die Wiedergewinnung durch die
Erzeugung neuer Übersetzungen
mit unterschiedlichen Speichertätigkeiten
und unterschiedlichen Optimierungen bewerkstelligt.
-
2 ist
ein Diagramm einer Formungshosthardware, die als das gleiche Anwendungsprogramm,
das am CISC-Prozessor von 1(a) ausgeführt wird,
ausführend
dargestellt ist. Wie ersichtlich ist, beinhaltet der Mikroprozessor
den Codeformungssoftwareabschnitt und den verbesserten Hardwareformungshostabschnitt, die
oben beschrieben wurden. Die Zielanwendung liefert die Zielbefehle
zur Codeformungssoftware, damit sie in Hostbefehle übersetzt
werden, zu deren Ausführung
der Formungshost fähig
ist. In der Zwischenzeit erhält das
Zielbetriebssystem Aufrufe vom Zielanwendungsprogramm und überträgt sie diese
zur Codeformungssoftware. In einer bevorzugten Ausführungsform
des Mikroprozessors ist der Formungshost ein Sehr-Langes-Befehlswort(Very
Long Instruction Word, VLIW)-Prozessor, der mit mehreren Verarbeitungskanälen gestaltet
ist. Die gesamte Tätigkeit
eines derartigen Prozessors ist in 6(c) näher veranschaulicht.
-
In 6(a) bis (c) sind Befehle veranschaulicht,
die zur Verwendung mit jedem aus einem CISC-Prozessor, einem RISC-Prozessor, und einem
VLIW-Prozessor geeignet sind. Wie ersichtlich ist, sind die CISC-Befehle
von wechselnden Längen
und können
sie mehrere primitivere Tätigkeiten
(z.B. Laden und Addieren) beinhalten. Die RISC-Befehle andererseits
sind von gleicher Länge
und sind im Wesentlichen Basistätigkeiten.
Der veranschaulichte einzelne sehr lange Befehl für den VLIW-Prozessor
beinhaltet jede der primitiveren Tätigkeiten (d.h., Laden, Speichern,
Addieren ganzer Zahlen, Vergleichen, Multiplizieren mit Gleitkomma,
und Verzweigen) der CISC- und RISC-Befehle. Wie in 6(c) ersichtlich
ist, wird jeder der Basisbefehle, die zusammen ein einzelnes sehr
langes Befehlswort aufbauen, parallel mit den anderen Basisbefehlen
entweder zu einem von mehreren gesonderten Verarbeitungskanälen des
VLIW-Prozessors oder zum Speicher geliefert, um parallel durch die
Verarbeitungskanäle
und den Speicher behandelt zu werden. Die Ergebnisse aller dieser
parallelen Tätigkeiten
werden in eine Registerdatei mit mehreren Ports übertragen.
-
Ein
VLIW-Prozessor, der die Basis des Formungshosts darstellen kann,
ist ein viel einfacherer Prozessor als die anderen oben beschriebenen
Prozessoren. Er beinhaltet kein Schaltsystem, um die Abhängigkeiten von
Punkten festzustellen oder Basisbefehle neuanzuordnen, zu optimieren,
und neu zu planen. Dies wiederum gestattet eine schnellere Verarbeitung
mit höheren
Taktraten, als entweder mit den Prozessoren, für die die Zielanwendungsprogramme
ursprünglich
bestimmt waren, oder anderen Prozessoren, die Emulationsprogramme
verwenden, um Zielanwendungsprogramme auszuführen, möglich ist. Doch der Prozessor
ist nicht auf VLIW-Prozessoren
beschränkt
und kann ebenso gut mit jeder belie bigen Art von Prozessor wie etwa
einem RSIC-Prozessor funktionieren.
-
Die
Codeformungssoftware des Mikroprozessors, der in 2 gezeigt
ist, beinhaltet einen Übersetzerabschnitt,
der die Befehle der Zielanwendung decodiert, diese Zielbefehle in
die Basishostbefehle umwandelt, die zur Ausführung durch den Formungshost
fähig sind,
die Tätigkeiten,
die durch die Zielbefehle benötigt werden,
optimiert, die Basisbefehle zu VLIW-Befehlen (einer Übersetzung)
für den
Formungshost neuanordnet und plant, und die Host-VLIW-Befehle ausführt. Die
Tätigkeiten
des Übersetzers
sind in 7 veranschaulicht, die die
Tätigkeit
der Hauptschleife der Codeformungssoftware veranschaulicht.
-
Um
die Tätigkeit
des Mikroprozessors, der die Codeformungssoftware und die verbesserte
Formungshosthardware beinhaltet, zu beschleunigen, beinhaltet die
Codeformungssoftware einen wie in 2 veranschaulichten Übersetzungspuffer.
Der Übersetzungspuffer
einer Ausführungsform
ist eine Softwaredatenstruktur, die in einem Speicher gespeichert
werden kann; in einer besonderen Ausführungsform könnte auch
ein Hardwarepufferspeicher benutzt werden. Der Übersetzungspuffer wird verwendet,
um die Hostbefehle, die jede abgeschlossene Übersetzung der Zielbefehle
verkörpern,
zu speichern. Wie ersichtlich ist, wird die sich ergebende Hostübersetzung
im Übersetzungspuffer
gespeichert, sobald die einzelnen Zielbefehle übersetzt wurden und die sich
ergebenden Hostbefehle optimiert, neuangeordnet, und neugeplant
wurden. Die Hostbefehle, die die Übersetzung aufbauen, werden
dann durch den Formungshost ausgeführt. Wenn die Hostbefehle ausgeführt werden,
ohne eine Ausnahme zu erzeugen, kann die Übersetzung danach aufgerufen
werden, wann immer die Tätigkeiten,
die durch den Zielbefehl oder die -befehle verlangt werden, erforderlich
sind.
-
Daher
ist wie in 7 gezeigt eine typische Tätigkeit
der Codeformungssoftware des Mikroprozessors, wenn dieser durch
das Anwendungsprogramm die Adresse eines Zielbefehls geliefert wird,
zuerst zu bestimmen, ob der Zielbefehl an der Zieladresse übersetzt
wurde. Wenn der Zielbefehl nicht übersetzt wurde, werden er und
nachfolgende Zielbefehle zu einer neuen Hostübersetzung abgerufen, decodiert, übersetzt,
und dann (möglicherweise)
optimiert, neuangeordnet und neugeplant, und durch den Übersetzer
im Übersetzungspuffer
gespeichert. Wie später
ersichtlich sein wird, gibt es verschiedene Grade der Optimierung,
die möglich sind.
Der Ausdruck „Optimierung" wird in dieser Beschreibung
häufig
generisch verwendet, um auf jene Techniken zu verweisen, durch die
die Verarbeitung beschleunigt wird. Zum Beispiel ist die Neuanordnung
eine Form der Optimierung, die eine schnellere Verarbeitung gestattet
und im Ausdruck beinhaltet ist. Viele der Optimierungen, die möglich sind,
wurden innerhalb des Stands der Technik von Kompiliereroptimierungen
beschrieben, und einige Optimierungen, die beim Stand der Technik
schwierig durchzuführen
waren, wie „Superblöcke", stammen aus der
VLIW-Forschung. Die Steuerung wird dann zur Übersetzung übertragen, um zu verursachen,
dass die Ausführung
durch die verbesserte Formungshostsoftware fortgesetzt wird.
-
Wenn
der bestimmten Zielbefehlsabfolge bei der Ausführung der Anwendung das nächste Mal
begegnet wird, wird dann die Hostübersetzung im Übersetzungspuffer
gefunden werden und ohne die Notwendigkeit des Übersetzens, Optimierens, Neuanordnens
oder Neuplanens sofort ausgeführt
werden. Bei Verwendung der nachstehend beschriebenen fortschrittlichen
Techniken wurde geschätzt,
dass die Übersetzung
für einen Zielbefehl
(sobald er vollständig übersetzt
wurde) im Übersetzungspuffer
stets bis auf ein Mal für
jeweils etwa eine Million Ausführungen
der Übersetzung
gefunden werden wird. Folglich können
nach einer ersten Übersetzung
alle Schritte, die für
die Übersetzung
benötigt
werden, wie etwa Decodieren, Abrufen der Basisbefehle, Optimieren
der Basisbefehle, Neuplanen in einer Hostübersetzung, und Speichern im Übersetzungspuffer aus
der benötigten
Verarbeitung beseitigt werden. Da der Prozessor, für den die
Zielbefehle geschrieben wurden, jeden Befehl jedes Mal, wenn der
Befehl ausgeführt
wird, decodieren, abrufen, neuanordnen, und neuplanen muss, verringert
dies die Arbeit, die zum Ausführen
der Zielbefehle benötigt
wird, drastisch und erhöht es
die Geschwindigkeit des verbesserten Mikroprozessors.
-
Durch
das Beseitigen aller dieser Schritte, die bei der Ausführung einer
Zielanwendung durch Prozessoren des Stands der Technik benötigt werden, überwindet
der Mikroprozessor, der die vorliegende Erfindung beinhaltet, Probleme
des Stands der Technik, die derartige Tätigkeiten bei jeder vernünftigen
Geschwindigkeit unmöglich
machten. Zum Beispiel wurden einige der Techniken des verbesserten
Mikroprozessors in den oben beschriebenen Emulatoren verwendet,
welche verwendet wurden, um Anwendungen zu anderen Systemen zu portieren.
Doch einige dieser Emulatoren verfügten über keine Weise, um mehr als
kurze Abschnitte von Anwendungen auszuführen, da bei der Verarbeitung übersetzter
Befehle Ausnahmen, die Aufrufe an verschiedene Systemausnahmebehandlungsprogramme
erzeugten, an Punkten bei der Tätigkeit
erzeugt wurden, an denen der Zustand des Hostprozessors keinen Bezug
zum Zustand eines Zielprozessors, der die gleichen Befehle verarbeitete,
aufwies. Dadurch war der Zustand des Zielprozessors an dem Punkt,
an dem eine derartige Ausnahme erzeugt wurde, nicht bekannt. Daher
konnte der richtige Zustand der Zielmaschine nicht bestimmt werden;
und musste die Tätigkeit
angehalten, neugestartet, und der richtige Zustand ermittelt werden,
bevor die Ausnahme bedient und die Ausführung fortgesetzt werden konnte.
Dies machte das Ausführen
eines Anwendungsprogramms mit der Hostgeschwindigkeit unmöglich.
-
Die
Formungshostsoftware beinhaltet eine Anzahl von Verbesserungen,
die dieses Problem überwinden.
Diese Verbesserungen sind jeweils in 3, 4,
und 5 veranschaulicht. Um den richtigen Zustand der
Register zur Zeit des Auftretens eines Fehlers zu bestimmen, wird
durch die verbesserte Hardware ein Satz von offiziellen Zielregistern
bereitgestellt, um den Zustand der Register des Zielprozessors,
für den
die ursprüngliche
Anwendung bestimmt war, zu halten. Diese Zielregister können in
jeder der Gleitkommaeinheiten, jeglichen Ganzzahleinheiten, und
jeglichen anderen Ausführungseinheiten
beinhaltet sein. Diese offiziellen Register wurden dem Formungshost
zusammen mit einer erhöhten
Anzahl von normalen Arbeitsregistern hinzugefügt, damit eine Anzahl von Optimierungen
einschließlich
einer Registerumbenennung ausgeführt
werden kann. Eine Ausführungsform
der verbesserten Hardware beinhaltet vierundsechzig Arbeitsregister
in der Ganzzahleinheit und zweiunddreißig Arbeitsregister in der
Gleitkommaeinheit. Die Ausführungsform
beinhaltet auch einen verbesserten Satz von Zielregistern, der alle
der häufig
veränderten
Register des Zielprozessors enthält,
die nötig
sind, um den Zustand dieses Prozessors bereitzustellen; diese beinhalten
Bedingungssteuerregister und andere Register, die zur Steuerung
des simulierten Systems nötig
sind.
-
Es
sollte bemerkt werden, dass eine übersetzte Befehlsabfolge abhängig von
der Art der verbesserten Verarbeitungssoftware, die durch den Formungshost
verwendet wird, Basistätigkeiten
beinhalten kann, die mehrere Zielbefehle von der ursprünglichen
Anwendung bilden. Zum Beispiel kann ein VLIW-Mikroprozessor fähig sein,
mehrere von entweder CISC- oder
RISC-Befehlen auf einmal auszuführen,
wie in 6(a) bis (c) veranschaulicht
ist. Doch der Zustand der Zielregister der Formungshosthardware
wird nicht verändert,
von welcher Art auch immer der Formungshost ist, außer an einer
integralen Zielbefehlsgrenze; und dann werden alle Register aktualisiert.
Wenn der Mikroprozessor einen Ziel befehl oder -befehle ausführt, die
in eine Reihe von Basisbefehlen übersetzt
wurden, welche möglicherweise
zu einer Hostübersetzung
neuangeordnet und neugeplant worden sind, halten daher die offiziellen
Zielregister dann, wenn der Prozessor mit der Ausführung der übersetzten
Befehlsabfolge beginnt, die Werte, die durch die Register des Zielprozessors,
für den
die Anwendung bestimmt war, gehalten würden, wenn der erste Zielbefehl
angesprochen wurde. Nachdem der Formungshost mit der Ausführung der übersetzten
Befehle begonnen hat, halten die Arbeitsregister jedoch Werte, die
durch die Basistätigkeiten
der übersetzten
Befehle, welche bis zu diesem Punkt ausgeführt wurden, bestimmt werden.
Obwohl einige dieser Arbeitsregister Werte halten können, die
mit jenen in den offiziellen Zielregistern identisch sind, können daher
andere der Arbeitsregister Werte halten, die für den Zielprozessor bedeutungslos
sind. Dies trifft besonders in einer Ausführungsform zu, die viel mehr
Register bereitstellt, als dies eine bestimmte Zielmaschine tut,
um fortschrittliche Beschleunigungstechniken zu gestatten. Sobald
die übersetzten
Hostbefehle beginnen, sind die Werte in den Arbeitsregistern das,
was der Zustand dieser Register aufgrund der Bestimmung dieser übersetzten
Hostbefehle zu sein hat. Wenn ein Satz von übersetzten Hostbefehlen ausgeführt wird,
ohne eine Ausnahme zu erzeugen, werden die neuen Arbeitsregisterwerte,
die am Ende des Satzes von Befehlen bestimmt werden, gemeinsam zu
den offiziellen Zielregistern (die möglicherweise ein Zielbefehlszeigerregister
beinhalten) übertragen.
In der vorliegenden Ausführungsform
des Prozessors findet diese Übertragung
außerhalb
der Ausführung
der Hostbefehle in einer zusätzlichen
Pipelinestufe statt, so dass sie die Tätigkeit des Formungshosts nicht
verlangsamt.
-
In
einer ähnlichen
Weise wird ein torgesteuerter Speicherungspuffer wie der in 5 veranschaulichte in
der Hardware des verbesserten Mikroprozessors benutzt, um die Übertragung
von Daten zum Speicher zu steuern. Der torge steuerte Speicherungspuffer
beinhaltet eine Anzahl von Elementen, wovon jedes die Adresse und
Daten für
eine Speicherspeicherungstätigkeit
halten kann. Diese Elemente können
durch jede beliebige einer Anzahl von unterschiedlichen Hardwareanordnungen
(z.B. First-In-First-Out-Puffer) ausgeführt werden; die veranschaulichte
Ausführungsform
ist unter Benutzung eines Direktzugriffsspeichers und dreier fest
zugeordneter Arbeitsregister ausgeführt. Die drei Register speichern
jeweils einen Zeiger zum Anfang der Schlange von Speicherspeicherungen,
einen Zeiger zum Tor, und einen Zeiger zum Ende der Schlange der
Speicherspeicherungen. Speicherspeicherungen, die zwischen dem Anfang
der Schlange und dem Tor positioniert sind, sind bereits dem Speicher übergeben,
während
jene, die zwischen dem Tor der Schlange und dem Ende positioniert
sind, noch nicht dem Speicher übergeben
sind. Speicherspeicherungen, die während der Ausführung von
Hostübersetzungen
erzeugt werden, werden durch die Ganzzahleinheit in der Reihenfolge,
in der sie während
der Ausführung
der Hostbefehle durch den Formungshost erzeugt werden, in den Speicherungspuffer
gestellt, dürfen
aber nicht in den Speicher geschrieben werden, bis in einem Hostbefehl
einer Übergabetätigkeit
begegnet wird. Daher werden die Speicherungstätigkeiten während der Ausführung der Übersetzungen in
die Schlange gestellt. Sofern dies die ersten Speicherungen sind,
so dass sich im torgesteuerten Speicherungspuffer keine anderen
Speicherungen befinden, werden sowohl der Anfangs- als auch der
Endzeiger auf die gleiche Position zeigen. Wenn jede Speicherung
ausgeführt
wird, wird sie in die nächste
Position in der Schlange gestellt und der Endpunkt auf die nächste Position
(in der Figur aufwärts)
erhöht.
Dies dauert an, bis ein Übergabebefehl
ausgeführt
wird. Dies wird normalerweise passieren, wenn die Übersetzung
eines Satzes von Zielbefehlen abgeschlossen wurde, ohne eine Ausnahme
oder eine Fehlerausstiegsbedingung zu erzeugen. Wenn eine Übersetzung
durch den Formungshost ohne Fehler ausgeführt wurde, werden die Speicherspeicherungen
im Speicherungspuffer, die wäh rend
der Ausführung
erzeugt wurden, gemeinsam durch das Tor des Speicherungspuffers
verschoben (übergeben)
und anschließend
in den Speicher geschrieben. In der veranschaulichten Ausführungsform
wird dies durch Kopieren des Werts im Register, das den Endzeiger
hält, in
das Register, das den Torzeiger hält, bewerkstelligt.
-
Daher
ist ersichtlich, dass sowohl die Übertragung des Registerzustands
von Arbeitsregistern zu offiziellen Zielregistern als auch die Übertragung
von Arbeitsspeicherspeicherungen zum offiziellen Speicher als Reaktion
auf ausdrückliche Übergabetätigkeiten
gemeinsam und nur an Grenzen zwischen integralen Zielbefehlen stattfindet.
-
Dies
gestattet dem Mikroprozessor, sich ohne jegliche bedeutende Verzögerung von
Zielausnahmen zu erholen, die während
der Ausführung
durch den verbesserten Formungshost auftreten. Wenn während der Ausführung eines
jeglichen übersetzten
Befehls oder von Befehlen eine Zielausnahme erzeugt wird, wird diese Ausnahme
durch die Formungshosthardware oder -software festgestellt. Als
Reaktion auf die Feststellung der Zielausnahme kann die Codeformungssoftware
verursachen, dass die Werte, die in den offiziellen Registern bewahrt
werden, in die Arbeitsregister zurückgestellt werden, und jegliche
nichtübergebene
Speicherspeicherungen im torgesteuerten Speicherungspuffer verworfen
werden (eine Tätigkeit,
die als „Rückführung" bezeichnet wird).
Die Speicherspeicherungen im torgesteuerten Speicherungspuffer von 5 können durch
Kopieren der Werte im Register, das den Torzeiger hält, in das
Register, das den Endzeiger hält,
verworfen werden.
-
Das
Stellen der Werte von den Zielregistern in die Arbeitsregister kann
die Adresse des ersten der Zielbefehle, die ausgeführt wurden,
als die Ausnahme auftrat, in das Arbeitsbefehlszeigerregister stellen.
Beginnend mit diesem offiziellen Zustand des Zielprozessors in den
Arbeitsregis tern werden die Zielbefehle, die ausgeführt wurden,
als die Ausnahme auftrat, ohne jegliche Neuanordnung oder andere
Optimierung in serieller Reihenfolge neuübersetzt. Nachdem jeder Zielbefehl
neu decodiert und in eine neue Hostübersetzung übersetzt wurde, wird der übersetzte
Hostbefehl, der die Zielbefehle darstellt, durch den Formungshost
ausgeführt und
verursacht, oder verursacht nicht, das Auftreten einer Ausnahme
(wenn der Formungshost ein anderer als ein VLIW-Prozessor ist, wird
jede der Basistätigkeiten
der Hostübersetzung
der Reihe nach ausgeführt.
Wenn keine Ausnahme auftritt, wenn die Hostübersetzung ausgeführt wird,
wird die nächste
Basisfunktion ausgeführt).
Dies dauert an, bis eine Ausnahme erneut auftritt oder der einzelne
Zielbefehl übersetzt
und ausgeführt wurde.
In einer Ausführungsform
wird der Zustand der Arbeitsregister zu den Zielregistern übertragen
und werden jegliche Daten im torgesteuerten Speicherungspuffer übergeben,
so dass sie zum Speicher übertragen werden
können,
wenn eine Übersetzung
eines Zielbefehls ohne eine Ausnahme ausgeführt wurde. Doch wenn eine Ausnahme
während
der Ausführung
einer Übersetzung
erneut auftritt, hat sich der Zustand der Zielregister und des Speichers
nicht verändert,
sondern ist er mit dem Zustand, der in einem Zielcomputer erzeugt
wird, wenn die Ausnahme auftritt, identisch. Folglich wird, wenn
die Zielausnahme erzeugt wird, die Ausnahme durch das Zielbetriebssystem
richtig behandelt werden.
-
In
der gleichen Weise zeigt der Zielbefehlszeiger auf den nächsten der
Zielbefehle, sobald ein erster Zielbefehl der Reihe von Befehlen,
deren Übersetzung
eine Ausnahme erzeugt hat, ohne Erzeugung einer Ausnahme ausgeführt wurde.
Dieser zweite Zielbefehl wird in der gleichen Weise wie der erste
decodiert und ohne Optimierung oder Neuanordnung neuübersetzt.
Da jede der Hostübersetzungen
eines einzelnen Zielbefehls durch den Formungshost verarbeitet wird,
wird jegliche erzeugte Ausnahme auftreten, wenn der Zustand der
Zielregister und des Speichers mit dem Zustand identisch ist, der
im Zielcomputer auftreten würde.
Folglich kann die Ausnahme sofort und richtig behandelt werden.
Diese neuen Übersetzungen
können
als die richtigen Übersetzungen
für diese
Abfolge von Befehlen in der Zielanwendung im Übersetzungspuffer gespeichert
werden und abgerufen werden, wann immer die Ausführungen neu ausgeführt werden.
-
Andere
Ausführungsformen
zur Bewerkstelligung des gleichen Ergebnisses wie der torgesteuerte Speicherungspuffer
von 5 können
Anordnungen beinhalten, um Speicherungen direkt zum Speicher zu übertragen,
während
Daten aufgezeichnet werden, die ausreichen, um den Zustand des Zielcomputers
wiederherzustellen, falls die Ausführung einer Übersetzung
zu einer Ausnahme oder einem Fehler führt, die bzw. der eine Rückführung erforderlich
macht. In einem solchen Fall würde
die Auswirkung jeglicher Speicherspeicherungen, die während der Übersetzung
und der Ausführung
stattfanden, umgekehrt werden müssen
und der Speicherzustand, der am Beginn der Übersetzung bestand, wiederhergestellt
werden müssen;
während
Arbeitsregister auf die oben besprochene Weise Daten erhalten müssten, die
in den offiziellen Zielregistern gehalten werden. Eine Ausführungsform,
um dies zu bewerkstelligen, unterhält einen gesonderten Zielspeicher, um
den ursprünglichen
Speicherzustand zu halten, der dann benutzt wird, um den überschriebenen
Speicher zu ersetzen, wenn eine Rückführung stattfindet. Eine andere
Ausführungsform
zum Bewerkstelligen einer Speicherrückführung zeichnet jede Speicherung
und die ersetzten Speicherdaten auf, wenn sie stattfinden, und kehrt
dann den Speicherungsprozess um, wenn eine Rückführung benötigt wird.
-
Die
Codeformungssoftware stellt eine zusätzliche Tätigkeit bereit, die die Geschwindigkeit
der Verarbeitung von Programmen, die übersetzt werden, stark steigert.
Zusätzlich
zum einfachen Übersetzen
der Befehle, dem Optimieren, Neuanordnen, Neuplanen, Puffern, und
Ausführen
jeder Über setzung,
damit sie erneut ausgeführt
werden kann, wann immer dieser Satz von Befehlen ausgeführt werden
muss, verknüpft
der Übersetzer
auch die verschiedenen Übersetzungen,
um in fast allen Fällen
eine Rückkehr
zur Hauptschleife des Übersetzungsprozesses
zu beseitigen. 8 veranschaulicht die Schritte,
die durch den Übersetzerabschnitt der
Codeformungssoftware ausgeführt
werden, um diesen Verknüpfungsprozess
zu bewerkstelligen. Fachleute werden verstehen, dass diese Verknüpfungstätigkeit
die Rückkehr
zur Hauptschleife für
die meisten Übersetzungen
von Befehlen im Wesentlichen beseitigt, was diesen Steuerungsaufwand
beseitigt.
-
Nehmen
wir zu Beispielszwecken an, dass das Zielprogramm, das ausgeführt wird,
aus X86-Befehlen besteht. Wenn eine Übersetzung einer Abfolge von
Zielbefehlen stattfindet und die Basishostbefehle neuangeordnet
und neugeplant werden, können
am Ende jeder Hostübersetzung
zwei Basisbefehle auftreten. Der erste ist ein Basisbefehl, der
den Wert des Befehlszeigers für
den Zielprozessor (oder sein Äquivalent)
aktualisiert; dieser Befehl wird verwendet, um die richtige Adresse
des nächsten
Zielbefehls in das Zielbefehlszeigerregister zu stellen. Diesem
Basisbefehl folgt ein Verzweigungsbefehl, der die Adresse von jedem
von zwei möglichen
Zielen für
die Verzweigung enthält.
Die Weise, auf die der Basisbefehl, der dem Verzweigungsbefehl vorausgeht,
den Wert des Befehlszeigers für
den Zielprozessor aktualisieren kann, ist, den Bedingungscode für die Verzweigung
in den Bedingungscoderegistern zu prüfen und dann zu bestimmen,
ob eine der beiden Verzweigungsadressen, die durch die Bedingung,
welche die Verzweigung steuert, angegeben sind, im Übersetzungspuffer
gespeichert ist. Das erste Mal, wenn die Abfolge von Zielbefehlen übersetzt
wird, halten die beiden Verzweigungsziele des Hostbefehls beide
die gleiche Hostprozessoradresse für die Hauptschleife der Übersetzersoftware.
-
Wenn
die Hostübersetzung
abgeschlossen, im Übersetzungspuffer
gespeichert, und zum ersten Mal ausgeführt wurde, wird der Befehlszeiger
im Zielbefehlszeigerregister aktualisiert (wie es der Rest der Zielregister
wird); und zweigt die Tätigkeit
zur Hauptschleife zurück.
In der Hauptschleife schlägt
die Übersetzersoftware
den Anweisungszeiger zum nächsten
Zielbefehl im Zielbefehlszeigerregister nach. Dann wird die nächste Zielbefehlsabfolge
angesprochen. Sofern diese Abfolge von Zielbefehlen noch nicht übersetzt
wurde und sich daher im Übersetzungspuffer
keine Übersetzung
befindet, wird der nächste
Satz von Zielbefehlen aus dem Speicher abgerufen, decodiert, übersetzt,
optimiert, neuangeordnet, neugeplant, im Übersetzungspuffer gepuffert,
und ausgeführt.
Da der zweite Satz von Zielbefehlen dem ersten Satz von Zielbefehlen
folgt, wird der Basisverzweigungsbefehl am Ende der Hostübersetzung
des ersten Satzes von Zielbefehlen automatisch aktualisiert, um
die Adresse der Hostübersetzung
des zweiten Satzes von Zielbefehlen als die Verzweigungsdresse für die bestimmte
Bedingung, die die Verzweigung steuert, zu übersetzen.
-
Wenn
dann der zweite übersetzte
Hostbefehl zum ersten übersetzten
Hostbefehl zurücklaufen
würde, würde die
Verzweigungstätigkeit
am Ende der zweiten Übersetzung
die Hauptschleifenadresse und die X86-Adresse der ersten Obersetzung
als die beiden möglichen
Ziele für
die Verzweigung beinhalten. Die Aktualisierungsbefehlszeiger-Basistätigkeit,
die der Verzweigung vorausgeht, prüft die Bedingung und bestimmt, dass
der Lauf zur ersten Übersetzung
zurück
unternommen werden soll, und aktualisiert den Zielbefehlszeiger auf
die X86-Adresse der ersten Übersetzung.
Dies verursacht, dass der Übersetzer
im Übersetzungspuffer nachsieht,
um zu sehen, ob die gesuchte X86-Adresse dort erscheint. Die Adresse
der ersten Übersetzung wird
gefunden, und ihr Wert im Hostspeicherplatz ersetzt die X86-Adresse in der Verzweigung
am Ende des zweiten übersetzten
Hostbefehls. Dann wird der zweite übersetzte Hostbefehl gepuffert
und ausgeführt.
Dies verursacht, dass die Schleife ausgeführt wird, bis die Bedingung,
die die Verzweigung von der ersten Übersetzung zur zweiten Übersetzung
verursacht, versagt, und die Verzweigung nimmt den Weg zur Hauptschleife zurück. Wenn
dies geschieht, zweigt der erste übersetzte Hostbefehl zur Hauptschleife
zurück
ab, wo im Übersetzungspuffer
nach dem nächsten
Satz von Zielbefehlen, der durch den Zielbefehlszeiger bezeichnet
wird, gesucht wird, die Hostübersetzung
aus dem Puffer abgerufen wird; oder die Suche im Übersetzungspuffer
fehlschlägt,
und die Zielbefehle aus dem Speicher abgerufen und übersetzt
werden. Wenn dieser übersetzte
Zielbefehl im Übersetzungspuffer
gepuffert ist, ersetzt seine Adresse die Hauptschleifenadresse im
Verzweigungsbefehl, der die Schleife beendete.
-
Auf
diese Weise werden die verschiedenen übersetzten Hostbefehle miteinander
verkettet, so dass die Notwendigkeit, dem langen Weg durch die Übersetzerhauptschleife
zu folgen, nur auftritt, wo keine Verknüpfung vorhanden ist. Letztendlich
werden die Hauptschleifenbezüge
in den Verzweigungsbefehlen der Hostbefehle beinahe vollständig beseitigt.
Wenn dieser Zustand erreicht ist, wird die Zeit, die nötig ist,
um Zielbefehle abzurufen, Zielbefehle zu decodieren, die Basisbefehle,
die die Zielbefehle aufbauen, abzurufen, diese Basistätigkeiten
zu optimieren, die Basistätigkeiten
neuanzuordnen, und diese Basistätigkeiten
neu zu planen, bevor jeglicher Hostbefehl ausgeführt wird, beseitigt. Daher
wird im Gegensatz zu allen Mikroprozessoren des Stands der Technik,
die jeden dieser Schritte jedes Mal vornehmen müssen, wenn jedwede Anwendungsbefehlsabfolge
ausgeführt
wird, die Arbeit, die benötigt
wird, um jeden beliebigen Satz von Zielbefehlen unter Verwendung
des verbesserten Mikroprozessors auszuführen, nachdem die erste Übersetzung
stattgefunden hat, drastisch verringert. Diese Arbeit wird weiter
verringert, da jeder Satz von übersetzten
Hostbefehlen mit den anderen Sätzen
von übersetzten Hostbefehlen
verknüpft
ist. Tatsächlich
wird geschätzt,
dass während
der Ausführung
einer Anwendung in weniger als einer Übersetzungsausführung von
einer Million eine Übersetzung
benötigt
werden wird.
-
Fachleute
werden erkennen, dass die Ausführung
des Mikroprozessors einen großen Übersetzungspuffer
benötigt,
da jeder Satz von Befehlen, der übersetzt
ist, gepuffert wird, damit er nicht erneut übersetzt werden muss. Übersetzer,
die dazu bestimmt sind, mit Anwendungen zu funktionieren, die für andere
Systeme programmiert sind, werden sich in ihrem Bedarf an einem
unterstützenden
Pufferspeicher unterscheiden. Doch eine Ausführungsform des Mikroprozessors,
die dazu gestaltet ist, X86-Programme auszuführen, benutzt einen Übersetzungspuffer
von zwei Megabyte Direktzugriffsspeicher.
-
Zwei
zusätzliche
Hardwareverbesserungen helfen, die Geschwindigkeit, mit der Anwendungen
durch den Mikroprozessor, der die vorliegende Erfindung beinhaltet,
verarbeitet werden können,
zu erhöhen.
Die erste davon ist ein Abnormal/Normal(A/N)-Schutzbit, das mit
jeder Adressenübersetzung
in einem Lookaside-Übersetzungspuffer
(Translation Lookaside Buffer, TLB) (siehe 3) gespeichert
wird, in dem das Nachschlagen der physikalischen Adresse von Zielbefehlen
zuerst bewerkstelligt wird. Zielspeichertätigkeiten in Übersetzungen
können
von zwei Arten sein, jenen, die am Speicher tätig sind (normal), oder jenen,
die an einer speicherabgebildeten E/A-Vorrichtung tätig sind
(abnormal).
-
Ein
normaler Zugriff, der den Speicher betrifft, wird normal abgeschlossen.
Wenn Befehle am Speicher tätig
sind, ist die Optimierung und Neuanordnung dieser Befehle passend
und hilft sehr bei der Beschleunigung der Tätigkeit jedes beliebigen Systems,
das den Mikroprozessor, der die vorliegende Erfindung beinhaltet,
verwendet. Andererseits müssen
die Tätigkeiten
eines abnormalen Zugriffs, der eine E/A- Vorrichtung betrifft, häufig ohne
die Beseitigung jeglicher Schritte in der genauen Reihenfolge ausgeführt werden,
in der diese Tätigkeiten
programmiert sind, da sie ansonsten irgendeinen nachteiligen Einfluss
auf die E/A-Vorrichtung aufweisen können. Zum Beispiel kann eine
bestimmte E/A-Tätigkeit
die Auswirkung aufweisen, dass ein E/A-Register gelöscht wird;
wenn die Basistätigkeiten
nicht der Reihe nach stattfinden, kann das Ergebnis der Tätigkeiten anders
als die durch den Zielbefehl befohlene Tätigkeit sein. Ohne ein Mittel,
um den Speicher von einer speicherabgebildeten E/A zu unterscheiden,
ist es nötig,
den gesamten Speicher mit den konservativen Annahmen zu behandeln,
die verwendet werden, um Befehle zu übersetzen, welche eine speicherabgebildete
E/A betreffen. Dies beschränkt
die Natur der Optimierungen, die erzielbar sind, stark. Da Emulatoren
des Stands der Technik sowohl Mittel, um einen Fehler der Spekulation über die
Natur des angesprochenen Speichers festzustellen, als auch Mittel,
um sich von derartigen Fehlern zu erholen, fehlten, war ihre Leistung
beschränkt.
-
In
einer Ausführungsform
des Mikroprozessors, die in 11 veranschaulicht
ist, ist das A/N-Bit ein Bit, das im Lookaside-Übersetzungspuffer gesetzt werden
kann, um entweder eine Speicherseite oder eine speicherabgebildete
E/A anzugeben. Der Lookaside-Übersetzungspuffer
speichert Seitentabelleneinträge
für Speicherzugriffe.
Jeder derartige Eintrag beinhaltet eine virtuelle Adresse, auf die
zugegriffen wird, und die physikalische Adresse, an der auf die
gesuchten Daten zugegriffen werden kann, wie auch andere Informationen
hinsichtlich des Eintrags. In der vorliegenden Erfindung ist das
A/N-Bit ein Teil jener anderen Informationen und gibt es an, ob
die physikalische Adresse eine Speicheradresse oder eine speicherabgebildete E/A-Adresse
ist. Eine derartige Übersetzung
einer Tätigkeit,
die den Speicher betrifft, als ob sie eine Speichertätigkeit
wäre, ist
tatsächlich
eine Spekulation, dass die Tätigkeit
eine solche ist, die den Speicher betrifft. In einer Ausführungsform
wird dann, wenn die Codeformungssoftware zuerst versucht, eine Übersetzung
auszuführen,
die einen Zugriff entweder auf den Speicher oder auf eine speicherabgebildete
E/A-Vorrichtung erfordert, tatsächlich
angenommen, dass der Zugriff ein Speicherzugriff ist. In einer anderen
Ausführungsform könnte die
Software annehmen, dass der Zielbefehl einen E/A-Zugriff benötigt. Sofern
ein Zugriff auf diese Adresse nicht früher bewerkstelligt wurde, wird
im Lookaside-Übersetzungspuffer
kein Eintrag vorhanden sein; und der Zugriff wird im Lookaside-Übersetzungspuffer
fehlschlagen. Dieser Fehlschlag verursacht, dass die Software ein
Seitentabellennachschlagen vornimmt und eine Speicherstelle des
Lookaside-Übersetzungspuffers
mit dem Seitentabelleneintrag füllt,
um die richtige physikalische Adressenübersetzung für die virtuelle Adresse
bereitzustellen. Während
sie dies bewerkstelligt, verursacht die Software, dass das A/N-Bit
für die physikalische
Adresse in den Lookaside-Übersetzungspuffer
eingegeben wird. Dann findet ein anderer Versuch statt, den Zugriff
auszuführen,
bei dem nochmals angenommen wird, dass der Zugriff auf eine Speicheradresse
erfolgt. Während
der Zugriff versucht wird, wird der Zielspeicherbezug geprüft, indem
die angenommene Zugriffsart (normal oder abnormal) mit dem A/N-Schutzbit,
das sich nun im TLB-Seitentabelleneintrag befindet, verglichen wird.
Wenn die Zugriffsart nicht mit dem A/N-Schutz übereinstimmt, tritt eine Ausnahme auf.
Wenn die Tätigkeit
tatsächlich
den Speicher betrifft, wurden die oben beschriebenen Optimierungs-,
Neuanordnungs- und
Neuplanungstechniken während
der Übersetzung
richtig angewendet. Wenn der Vergleich mit dem A/N-Bit im TLB zeigt,
dass die Tätigkeit
jedoch eine E/A-Vorrichtung betrifft, verursacht die Ausführung, dass
eine Ausnahme vorgenommen wird; und erzeugt der Übersetzer einen Zielbefehl
nach dem anderen eine neue Übersetzung
ohne jegliches Optimieren, Neuanordnen, oder Neuplanen. In der gleichen
Weise verursacht die Ausführung,
dass eine Ausnahme vorgenommen wird, wenn eine Übersetzung für eine Tätigkeit,
die tatsächlich
den Speicher betrifft, unrichtig eine E/A-Tätigkeit
annimmt, und werden die Zielbefehle unter Verwendung der Optimierungs-,
Neuanordnungs-, und Neuplanungstechniken neuübersetzt. Auf diese Weise kann
der Prozessor das Leistungsvermögen über das,
was herkömmlich
möglich
war, hinaus verbessern.
-
Fachleute
werden erkennen, dass die Technik, die das A/N-Bit verwendet, um zu bestimmen, ob hinsichtlich
dessen, ob ein Zugriff auf einen Speicher oder eine speicherabgebildete
E/A-Vorrichtung erfolgt, ein Fehler der Spekulation aufgetreten
ist, auch für
Spekulationen hinsichtlich anderer Eigenschaften von speicherabgebildeten
Adressen verwendet werden kann. Zum Beispiel könnten unter Verwendung eines
derartigen Normal/Abnormal-Bits unterschiedliche Arten von Speicher
unterschieden werden. Durch Fachleute werden andere ähnliche
Verwendungen bei der Unterscheidung von Speichereigenschaften gefunden
werden.
-
Eine
der häufigsten
Spekulationen, die durch den verbesserten Mikroprozessor ausgeführt wird,
ist, dass in einer Übersetzung
keine Zielausnahmen auftreten werden. Dies gestattet eine bedeutende
Optimierung gegenüber
dem Stand der Technik. Erstens muss der Zielzustand nicht an jeder
Zielbefehlsgrenze aktualisiert werden, sondern nur an Zielbefehlsgrenzen,
die an Übersetzungsgrenzen
auftreten. Dies beseitigt Befehle, die nötig sind, um den Zielzustand
an jeder Zielbefehlsgrenze zu speichern. Optimierungen, die beim Planen
und Entfernen redundanter Tätigkeiten
früher
unmöglich
gewesen wären,
werden ebenfalls möglich gemacht.
-
Der
verbesserte Mikroprozessor ist bewundernswert geeignet, den passenden Übersetzungsprozess zu
wählen.
Nach dem oben beschriebenen Übersetzungsverfahren
kann ein Satz von Befehlen zuerst so übersetzt werden, als ob er
den Speicher betreffen würde.
Wenn dann die optimierten, neuangeordneten, und neugeplanten Hostbefehle
ausgeführt
werden, kann durch den Zustand des A/N-Bits, das im Lookaside-Übersetzungspuffer
bereitgestellt ist, herausgefunden werden, dass sich die Adresse
auf eine E/A-Vorrichtung bezieht. Der Vergleich des A/N-Bits und
der übersetzten
Befehlsadresse, die zeigt, dass eine Tätigkeit eine E/A-Tätigkeit
ist, erzeugt eine Fehlerausnahme, die verursacht, dass ein softwareeingeleiteter
Rückführungsvorgang stattfindet,
was verursacht, dass jegliche nichtübergebenen Speicherspeicherungen
verworfen werden und die Werte in den Zielregistern in die Arbeitsregister
zurückgestellt
werden. Dann beginnt die Übersetzung
noch einmal einen Zielbefehl nach dem anderen ohne Optimierung,
Neuanordnung, oder Neuplanung. Diese Neuübersetzung ist die passende
Hostübersetzung
für eine
E/A-Vorrichtung.
-
Auf
eine ähnliche
Weise ist es möglich,
dass eine Speichertätigkeit
unrichtig als eine E/A-Tätigkeit übersetzt
wird. Der erzeugte Fehler kann verwendet werden, um ihre richtige
Neuübersetzung
zu verursachen, bei der sie optimiert, neuangeordnet, und neugeplant
werden kann, um eine schnellere Tätigkeit bereitzustellen.
-
Emulatoren
des Stands der Technik haben auch mit dem gekämpft, was allgemein als selbstmodifizierender
Code bezeichnet wird. Sollte ein Zielprogramm in den Speicher schreiben,
der Zielbefehle enthält,
wird dies verursachen, dass Übersetzungen,
die für
diese Zielbefehle bestehen, „alt" und nicht länger gültig werden. Es
ist nötig,
diese Speicherungen festzustellen, da sie dynamisch auftreten. Beim
Stand der Technik wurde diese Feststellung mit Sonderbefehlen für jede Speicherung
bewerkstelligt. Dieses Problem weist einen größeren Umfang auf, als Programme,
die sich selbst modifizieren. Jeder beliebige Mittler, der in den
Speicher schreiben kann, wie etwa ein zweiter Prozessor oder eine
DMA-Vorrichtung, kann dieses Problem ebenfalls verursachen.
-
Die
vorliegende Erfindung behandelt dieses Problem durch eine andere
Verbesserung am Formungshost. Ein Übersetzungsbit (T-Bit), das
ebenfalls im Lookaside-Übersetzungspuffer
gespeichert werden kann, wird verwendet, um Zielspeicherseiten anzugeben,
für die Übersetzungen
vorhanden sind. Das T-Bit gibt daher möglicherweise an, dass bestimmte
Seiten des Zielspeichers Zielbefehle enthalten, für die Übersetzungen vorhanden
sind, die alt werden würden,
wenn diese Zielbefehle überschrieben
werden sollten. Wenn ein Versuch unternommen wird, in diese geschützten Seiten
im Speicher zu schreiben, wird das Vorhandensein des Übersetzungsbits
eine Ausnahme erzeugen, die dann, wenn sie durch die Codeformungssoftware
behandelt wird, verursachen kann, dass die entsprechende(n) Übersetzung(en)
ungültig
gemacht werden oder aus dem Übersetzungspuffer
entfernt werden. Das T-Bit kann auch verwendet werden, um andere
Zielseiten zu kennzeichnen, deren Übersetzung sich möglicherweise
darauf verlässt,
nicht geschrieben zu werden.
-
Dies
kann unter Bezugnahme auf 3 verstanden
werden, die die allgemeinen funktionellen Elemente des Mikroprozessors,
der die Erfindung beinhaltet, in Blockdiagrammform veranschaulicht.
Wenn der Formungshost ein Zielprogramm ausführt, führt er tatsächlich den Übersetzerabschnitt der Codeformungssoftware
aus, der die einzigen ursprünglichen
unübersetzten
Hostbefehle beinhaltet, die wirksam am Formungshost laufen. Rechts
in der Figur ist der Speicher veranschaulicht, der in einen Hostabschnitt,
der im Wesentlichen den Übersetzer
und den Übersetzungspuffer
beinhaltet, und einen Zielabschnitt, der die Zielbefehle und Daten
einschließlich
des Zielbetriebssystems beinhaltet, geteilt ist. Die Formungshosthardware
beginnt das Ausführen
des Übersetzers
durch Abrufen von Hostbefehlen aus dem Speicher und Stellen dieser
Befehle in einen Befehlspuffer. Die Übersetzerbefehle erzeugen einen
Abruf der ersten Zielbefehle, die im Zielabschnitt des Speichers
gespeichert sind. Das Ausführen
eines Zielabrufs verursacht, dass die Ganz zahleinheit im offiziellen
Zielbefehlszeigerregister nach einer ersten Adresse eines Zielbefehls
sucht. Dann wird im Lookaside-Übersetzungspuffer
der Speicherverwaltungseinheit auf die erste Adresse zugegriffen.
Die Speicherverwaltungseinheit beinhaltet Hardware zur Seitenauslagerung
und stellt Speicherabbildungseinrichtungen für den TLB bereit. Sofern der
TLB richtig abgebildet ist, so dass er Nachschlagedaten für die richtige
Seite des Zielspeichers enthält,
wird der Zielbefehlszeigerwert in die physikalische Adresse des
Zielbefehls übersetzt.
An diesem Punkt wird der Zustand des Bits (T-Bits), das angibt,
ob für
den Zielbefehl eine Übersetzung
bewerkstelligt wurde, festgestellt; doch ist der Zugriff eine Lesetätigkeit
und wird keine T-Bit-Ausnahme stattfinden. Der Zustand des A/N-Bits,
das angibt, ob der Zugriff auf den Speicher oder eine speicherabgebildete
E/A erfolgt, wird ebenfalls festgestellt. Sofern das letztgenannte
Bit eine Speicherstelle angibt, wird im Zielspeicher auf den Zielbefehl
zugegriffen, da keine Übersetzung
vorhanden ist. Der Zielbefehl und die nachfolgenden Zielbefehle
werden als Daten zu den Formungshostberechnungseinheiten übertragen
und unter Steuerung der Übersetzerbefehle,
die im Befehlspuffer gespeichert sind, übersetzt. Die Übersetzerbefehle
benutzen Neuanordnungs-, Optimierungs-, und Neuplanungstechniken,
als ob der Zielbefehl den Speicher betreffen würde. Die sich ergebende Übersetzung,
die eine Abfolge von Hostbefehlen enthält, wird dann im Übersetzungspuffer
im Hostspeicher gespeichert. Die Übersetzung wird über den
torgesteuerten Speicherungspuffer direkt zum Übersetzungspuffer im Hostspeicher übertragen.
Sobald die Übersetzung
im Hostspeicher gespeichert wurde, verzweigt der Übersetzer
zur Übersetzung,
die dann ausgeführt
wird. Die Ausführung
(und nachfolgende Ausführungen)
werden bestimmen, ob die Übersetzung
hinsichtlich Ausnahmen und des Speichers richtige Annahmen getroffen
hat. Vor dem Ausführen
der Übersetzung
wird das T-Bit für
die Zielseite(n), die die Zielbefehle enthält (enthalten), die übersetzt
wurden, gesetzt.
-
Diese
Angabe warnt, dass der Befehl übersetzt
wurde; und dass ein Versuch, wenn es zu einem Versuch, an die Zieladresse
zu schreiben, kommt, eine Ausnahme erzeugt, die verursacht, dass
die Übersetzung möglicherweise
ungültig
gemacht oder entfernt wird.
-
Wenn
versucht wird, auf Zielseiten zu schreiben, die durch ein T-Bit
gekennzeichnet sind, kommt es zu einer Ausnahme und wird das Schreiben
abgebrochen. Dem Schreiben wird eine Fortsetzung gestattet werden,
nachdem die Reaktion auf die Ausnahme sicherstellt, dass die Übersetzungen,
die mit der Zielspeicheradresse, an die geschrieben werden soll,
verbunden sind, entweder als ungültig
gekennzeichnet sind oder auf andere Weise vor einer Verwendung geschützt sind,
bis sie passend aktualisiert wurden. Einige Schreibtätigkeiten
werden tatsächlich
keine Handlung erfordern, da keine gültigen Übersetzungen betroffen sein
werden. Andere Schreibtätigkeiten
werden erfordern, dass eine oder mehrere Übersetzungen, die mit dem angesprochenen
Zielspeicher verbunden sind, passend gekennzeichnet oder entfernt
werden. 11 veranschaulicht eine Ausführungsform
eines Lookaside-Übersetzungspuffers,
der mit jedem Eintrag Speicherstellen beinhaltet, um eine T-Bit-Angabe
zu halten.
-
Eine
zusätzliche
Hardwareverbesserung am Formungshost ist eine Schaltung, die benutzt
wird, um Daten, die normalerweise im Speicher gespeichert sind,
aber bei der Ausführung
einer Tätigkeit
sehr oft verwendet werden, zu gestatten, in einem Ausführungseinheitsregister
nachgebildet (oder "repliziert") zu werden, um die
Zeit, die benötigt
wird, um die Daten aus dem Speicher abzurufen oder die Daten dort
zu speichern, zu beseitigen. Zum Beispiel müssen die Daten, wenn Daten
im Speicher während
der Ausführung
einer Codeabfolge häufig
wiederverwendet werden, typischerweise jedes Mal, wenn die Daten
verwendet werden, aus dem Speicher abgerufen und in ein Register
in einer Ausführungseinheit
geladen werden. Um die Zeit, die durch derartige häufige Speicherzugriffe
benötigt
wird, zu verringern, können
die Daten nach der vorliegenden Erfindung stattdessen am Beginn
der Codeabfolge ein Mal aus dem Speicher in ein Ausführungseinheitsregister geladen
werden, und kann das Register dazu bestimmt werden, während des
Zeitraums, für
den die Codeabfolge andauert, anstelle des Speicherplatzes zu arbeiten.
Sobald dies bewerkstelligt wurde, wird jede der Ladetätigkeiten,
die normalerweise das Laden von der bestimmten Speicheradresse in
ein Register umfassen würde,
stattdessen eine einfache Kopiertätigkeit von Register zu Register,
die mit einer viel schnelleren Geschwindigkeit abläuft; und
können
selbst diese Kopiertätigkeiten
häufig
durch eine weitere Optimierung beseitigt werden.
-
In
der gleichen Weise erfordert die Ausführung einer Codeabfolge häufig, dass
Daten während
der Ausführung
einer Codeabfolge häufig
an eine Speicheradresse geschrieben werden. Um die Zeit, die durch derartige
häufige
Speicherspeicherungen an die gleiche Adresse benötigt wird, zu verringern, können die
Daten nach der vorliegenden Erfindung jedes Mal, wenn sie an die
Speicheradresse geschrieben werden sollen, zu einem Ausführungseinheitsregister übertragen
werden, das dazu bestimmt ist, während
des Zeitraums, für den
die Codeabfolge andauert, anstelle des Speicherplatzes zu arbeiten.
Sobald ein Ausführungseinheitsregister
bestimmt wurde, erfordert jede Veränderung an den Daten nur eine
einfache Übertragungstätigkeit
von Register zu Register, die viel schneller als das Speichern an
einer Speicheradresse abläuft.
-
Die
vorliegende Erfindung stellt eine einzigartige Anordnung bereit,
um diese Replizierungstätigkeiten zu
bewerkstelligen. In einer Ausführungsform,
die in 10 veranschaulicht ist, ist
der Formungshost dazu gestaltet, auf einen Befehl „Halten
und Schützen" in Bezug auf eine
bestimmte Speicheradresse, die in einer Codeabfolge häufig verwendet
werden soll, zu reagieren. Der Formungshost teilt ein Arbeitsregister 111 in
einer Ausführungseinheit 110 zu,
um die Speicherdaten zu halten, und speichert die Speicheradresse
in einem besonderen Register 112 der Speichersteuerungseinheit.
Das Arbeitsregister 111 kann eines aus einer Anzahl von
Registern (z.B. acht der Arbeitsregister, die in 4 veranschaulicht
sind) in einer Ausführungseinheit sein,
die für
einen derartigen Zweck zugeteilt werden können.
-
Wenn
die Erfindung verwendet wird, um Ladungen von einer Speicheradresse
zur Ausführungseinheit zu
beseitigen, werden die Daten an der Speicheradresse zuerst in das
Register 111 geladen und wird die Speicheradresse in das
Register 112 gestellt. Danach wird die Codeabfolge unter
Verwendung der Daten im Register 111 mit einer beschleunigten
Geschwindigkeit ausgeführt.
Während
dieses Zeitraums wird jede Tätigkeit,
die normalerweise eine Ladung von der Speicheradresse, die im Register 112 gehalten
wird, erfordern würde,
stattdessen durch Kopieren der Daten vom Register 111 bewerkstelligt.
Dies dauert an, bis die Codeabfolge abgeschlossen ist (oder auf
irgendeine andere Weise endet), und der Schutz des Speicherplatzes
entfernt wird.
-
In
der gleichen Weise kann ein ähnlicher
Replizierungsprozess ausgeführt
werden, um eine Codeabfolge, die ständig Daten von einer Ausführungseinheit 110 an
der gleichen Speicheradresse speichert, zu beschleunigen. Ein Befehl „Laden
und Schützen" verursacht, dass
die Speicheradresse in das Register 112 gestellt wird und
die Daten, die normalerweise an dieser Speicheradresse gespeichert
würden,
stattdessen zum Arbeitsregister 111 übertragen werden. Zum Beispiel
wird der Prozess des Speicherns in einer Berechnung, in der eine
Schleifenausführung
normalerweise eine Reihe von Daten an der gleichen Speicheradresse
speichern würde,
durch Zuteilen eines Registers 111, um die Daten zu halten,
und Halten der Speicheradresse in einem Register 112 zu
einer Übertragung
von Register zu Register in der Ausführungseinheit. Diese Tätigkeit dauert
ebenfalls an, bis die Codeabfolge abgeschlossen ist (oder auf irgendeine
andere Weise endet), der Speicher aktualisiert wird, und der Schutz
des Speicherplatzes entfernt wird.
-
Obwohl
jede dieser Replizierungstechniken die Geschwindigkeit der Ausführung einiger
Codeabfolgen stark steigert, verursachen diese Tätigkeiten, durch die Speicherzugriffe
beseitigt werden, eine bedeutende Anzahl von Problemen. Dies trifft
besonders zu, wo ein wesentlicher Abschnitt der Hostprozessortätigkeiten die Übersetzung
von Befehlen zwischen einem Zielbefehlssatz und dem Hostbefehlssatz
betrifft. Alle diese Probleme stehen mit der Notwendigkeit in Zusammenhang,
sicherzustellen, dass Daten, die bei der Ausführung eines Befehls verwendet
werden sollen, zu der Zeit, zu der sie verwendet werden sollen,
gültig
sind.
-
Es
gibt eine Anzahl von Fällen,
in denen sich Daten, die an einer Speicheradresse gespeichert sind, und
Daten, die in einem Ausführungseinheitsregister
gespeichert sind, unterscheiden, so dass in jedem bestimmten Augenblick
die einen oder die anderen ungültig
sind. Wenn zum Beispiel ein Arbeitsregister 111 verwendet
wird, um Daten zu halten, die während
einer Codeabfolge normalerweise häufig vom Speicherplatz zu Registern
geladen würden,
kann ein Befehl an die Speicheradresse schreiben, bevor die Codeabfolge,
die die Daten im Ausführungseinheitsregister
verwendet, abgeschlossen ist. In einem solchen Fall werden die Daten im
Ausführungseinheitsregister,
die durch die Codeabfolge benutzt werden, alt sein und müssen sie
aktualisiert werden.
-
Als
anderes Beispiel kann, wenn ein Arbeitsregister verwendet wird,
um Daten zu halten, die während einer
Codeabfolge normalerweise häufig
an einer Speicheradresse gespeichert würden, ein Befehl versuchen, an
die Speicheradresse zu schreiben, bevor die Codeabfolge, die das
Ausführungsein heitsregister
anstatt des Speichers verwendet, abgeschlossen ist. Wenn der Hostprozessor
in einer Betriebsart arbeitet, in der Daten an der Speicheradresse
normalerweise nur am Ende der Codeabfolge aktualisiert werden (einer
Rückschreibe-Betriebsart),
werden die Daten im Ausführungseinheitsregister
alt sein und müssen
sie durch Daten, die an die Speicheradresse geschrieben wurden,
aktualisiert werden. Natürlich
werden das Register und der Speicher übereinstimmen, wenn der Hostprozessor
in einer Betriebsart arbeitet, in der Daten an der Speicheradresse
normalerweise jedes Mal aktualisiert werden, wenn sie in das Ausführungseinheitsregister
geschrieben werden (einer DurchschreibeBetriebsart).
-
Als
noch ein anderes Beispiel kann, wenn ein Arbeitsregister verwendet
wird, um Daten zu halten, die während
einer Codeabfolge normalerweise häufig an einer Speicheradresse
gespeichert würden,
ein Befehl versuchen, Daten von der Speicheradresse zu lesen, bevor
die Codeabfolge, die Daten zum Register 111 überträgt, abgeschlossen
ist. Wenn der Hostprozessor in einer Betriebsart arbeitet, in der
Daten an der Speicheradresse normalerweise nur am Ende der Codeabfolge
aktualisiert werden (einer Rückschreibe-Betriebsart),
werden die Daten im Speicher alt sein und müssen sie durch Daten vom Ausführungseinheitsregister
aktualisiert werden, bevor die Lesetätigkeit gestattet wird. Wie
beim obigen Beispiel werden das Register und der Speicher übereinstimmen,
wenn der Hostprozessor in einer Betriebsart arbeitet, in der Daten
an der Speicheradresse normalerweise jedes Mal aktualisiert werden,
wenn sie in das Ausführungseinheitsregister
geschrieben werden (einer Durchschreibe-Betriebsart).
-
Eine
andere Möglichkeit,
durch die Daten, die im Speicher und in Replizierungsregistern gehalten
werden, nicht übereinstimmend
werden können,
besteht, da der Mikroprozessor, der durch die Kombination aus dem
Formungshost und der Codeformungssoftware gebildet ist, dazu geeignet
ist, Hostbefehle neuanzuordnen und neu zu planen, um die Ausführung zu
beschleunigen. Wie in den verschiedenen Beispielen von Codeabfolgen,
die nachstehend bereitgestellt sind, ersichtlich sein wird, können die
Daten im Ausführungseinheitsregister
zu anderen Registern kopiert werden und kann ein Prozess des Neuanordnens
und Neuplanens von Befehlen stattfinden, sobald Speicherdaten in
einem Ausführungseinheitsregister
repliziert wurden, um bei der Ausführung einer Codeabfolge verwendet
zu werden. Wenn das Neuanordnen und Neuplanen stattgefunden hat,
ist es für
einen Befehl in der Codeabfolge möglich, an die Speicheradresse,
die repliziert wird, zu schreiben, so dass die Daten im Ausführungseinheitsregister
vor der weiteren Verwendung aktualisiert werden müssen. Doch
wenn die nun alten Daten im Ausführungseinheitsregister 111 bereits
zu zusätzlichen
Registern kopiert wurden und die Codeabfolge der Befehle, die diese
Register verwendet, geändert
wurde, können
bei der Ausführung
der Codeabfolge alte Daten in Registern, zu denen diese Daten kopiert
wurden, benutzt werden. Daher kann eine Nichtübereinstimmung zweiter Ordnung
auftreten.
-
Um
sicherzugehen, dass Ladungen von der und Speicherungen an die Speicheradresse,
die geschützt
wird, nicht stattfinden, ohne zu verifizieren, dass die Daten an
der Speicheradresse und im Register 111 nach der Lade-
oder Speichertätigkeit übereinstimmen,
ist ein Vergleicher 113 in der Speichersteuerungseinheit
mit dem Adressenregister 112 verbunden. Der Vergleicher 113 erhält die Adressen
von Ladungen vom Speicher und Speicherungen an den torgesteuerten
Speicherungspuffer, die während Übersetzungen
zum Speicher gerichtet sind. Wenn sich eine Speicheradresse entweder
für eine
Ladung oder eine Speicherung mit einer Adresse im Register 112 (oder,
abhängig
von der Ausführung,
zusätzlichen
Registern) vergleichen lässt, kann
abhängig
von der Betriebsart eine Ausnahme erzeugt werden. Die Codeformungssoftware
reagiert durch Sicherstellen, dass die Speicheradresse und das Ausführungseinheitsregister 111 die
gleichen richtigen Daten halten, auf die Ausnahme. Dies gestattet,
dass die oben beschriebenen Nichtübereinstimmungen korrigiert werden.
-
Die
Weise, auf die die Codeformungssoftware reagiert, hängt von
der bestimmten Ausnahme ab. Wenn die Daten nicht die gleichen sind,
wird die Übersetzung
in einer Ausführungsform
zurückgeführt und ohne
jegliche „replizierten" Daten in einem Ausführungseinheitsregister
neu ausgeführt.
Eine derartige Lösung gestattet
die Korrektur von Nichtübereinstimmungen,
die sowohl zwischen dem Speicher und dem Ausführungseinheitsregister als
auch zwischen dem Speicher und anderen Registern, die die Daten
vom Ausführungseinheitsregister 111 kopiert
haben, bevor die Codeabfolge neuangeordnet oder neugeplant wurde,
auftreten. Andere mögliche
Verfahren zur Korrektur des Problems sind das Aktualisieren des
Ausführungseinheitsregisters
mit den neuesten Speicherdaten oder des Speichers mit den neuesten
Ladedaten.
-
Während des
Zeitraums, in dem eine Speicheradresse repliziert ist, um Ladungen
von dieser Speicheradresse zu beseitigen, sucht der Vergleicher
nach Versuchen, an die Speicheradresse zu schreiben, da die Daten
im Ausführungseinheitsregister 111 alt
werden können,
wenn die neuen Daten an die Speicheradresse geschrieben werden.
In einem solchen Fall stellt der Vergleicher 113 den Versuch,
an die geschützte Speicheradresse
zu schreiben, fest, und erzeugt er eine Ausnahme wenn ein derartiger
Versuch stattfindet. Die Ausnahme verursacht entweder, dass die
Daten im Speicher zum Register 111 geschrieben werden,
um das Register zu aktualisieren, bevor die Registerdaten weiter
verwendet werden können,
oder verursacht eine Rückführung und
eine Ausführung
von Code, der kein Ausführungseinheitsregister
verwendet, um eine Replizierungsoptimierung zu bewerkstelligen.
Dies kann eine Neuübersetzung
des Zielcodes umfassen.
-
Während des
Zeitraums, in dem eine Speicheradresse repliziert ist, um aufeinanderfolgende
Speicherungstätigkeiten
unter Verwendung eines Registers 111 zur Vertretung der
Speicheradresse zu gestatten, kann die Erzeugung einer Ausnahme
für eine
Speicherung an der Speicheradresse durch einen Befehl, der das Schaltsystem
in eine Betriebsart (Durchschreibe-Betriebsart) stellt, in der Speicherungen
vom Register 111 an der Speicheradresse ohne Replizierungsprüfung stattfinden
können,
außer
Kraft gesetzt werden, wodurch die wiederholte Speicherung vom Register
im Speicher an der geschützten
Adresse gestattet wird.
-
Alternativ
kann das Schaltsystem während
eines Zeitraums, in dem eine Speicheradresse repliziert ist, um
Speicherungstätigkeiten
unter Verwendung eines Registers 111 zur Vertretung der
Speicheradresse zu gestatten, in eine Betriebsart (Rückschreibe-Betriebsart)
gestellt werden, in der die Daten an der Speicherstelle nicht aktualisiert
werden, bis die Codeabfolge abgeschlossen oder auf eine andere Weise
beendet wurde. In einer derartigen Betriebsart kann eine Schreibtätigkeit
durch einen Befehl an die Speicheradresse erfordern, dass die Daten,
die im Ausführungseinheitsregister
gehalten werden, aktualisiert werden, um mit den neuen Daten übereinzustimmen.
Andererseits wird in einer derartigen Betriebsart ein Versuch, die
Speicheradresse zu lesen, erfordern, dass eine Ausnahme erzeugt
wird, so dass die Daten, die im Speicherplatz gehalten werden, aktualisiert
werden können,
um mit den neuen Daten im Ausführungseinheitsregister übereinzustimmen, bevor
sie gelesen werden.
-
12 veranschaulicht ein Replizierungsschaltsystem,
das eine Ausführungsform
eines Vergleichers 120 zum Feststellen und Steuern von
Lade- und Speicherungstätigkeiten
an einem geschützten
Speicherplatz nach der vorliegenden Erfindung beinhaltet. Der Vergleicher 120 beinhaltet
mehrere Spei cherstellen 122 (wovon nur eine veranschaulicht
ist) wie etwa einen inhaltsadressierbaren Speicher für Einträge von Speicheradressen,
die geschützt
werden sollen. Zum Beispiel kann es acht Stellen für Einträge geben.
Jeder Eintrag beinhaltet eine ausreichende Anzahl von Bitpositionen
(z.B. 32), um eine physikalische Adresse für die Speicherstelle zu speichern,
eine Bytemaske, und verschiedene Attributbits. Unter den Attributbits
sind jene, die die Größe des geschützten Speichers
angeben, und angeben, ob die Speicheradresse normal oder abnormal
ist. Es sollte bemerkt werden, dass die Stellen für Einträge im Vergleicher 120 einem
in 10 gezeigten Register 112 gleichwertig
sind, so dass der Vergleicher 120 den Zweck sowohl des
Registers 112 als auch des Vergleichers 113 von 10 erfüllt.
-
Das
Replizierungsschaltsystem beinhaltet auch ein Replizierungsaktivierungsregister 124,
ein Register 125, um das Replizierungsfreigaberegister
zu beschatten, ein Replizierungsfehlerregister 126, ein
Register 127, das eine Angabe (z.B. ein einzelnes Bit)
speichert, dass das Replizierungsschaltsystem aktiviert ist, und ein
Register 128, das ein Betriebsartbit speichert.
-
Im
Betrieb wird eine physikalische Adresse, die geschützt werden
soll, zusammen mit einer Bytemaske, deren Bits angeben, welche Bytes
der Stelle geschützt
sind, an einer der Speicherstellen für Einträge gespeichert. Eine derartige
physikalische Adresse kann 64 Bits von Daten ansprechen, so dass
jedes Bit der Bytemaske ein Byte der Daten an der Adresse angibt.
Der bestimmte Eintrag, der geschützt
ist, wird durch Stellen eines bestimmten Bits des Hardwareaktivierungsregisters 124 angegeben.
Das Register 125 beschattet die Werte im Register 124 an Übergabepunkten
während
der Übersetzung,
um zu gestatten, dass während der Übersetzung
Rückführungen
stattfinden. In der gezeigten Ausführungsform sind das Aktivierungsregister 24 und
das Beschattungsaktivierungsregister physikalisch als Attributbits
der Speicherstellen 122 verteilt.
-
Wenn
das Replizieren wie durch das Register 127 angegeben aktiviert
ist, hält
der Vergleicher abhängig
vom Zustand, in den die Betriebsart wie durch das Register 128 angegeben
gestellt ist, eine physikalische Speicheradresse und eine Bytemaske
und verwendet er diese, um Adressen von Speicherungen zum Speicher
oder sowohl Ladungen als auch Speicherungen zu prüfen. Wenn
die Betriebsart auf einen Durchschreibezustand gestellt ist, wird
der Speicher fortlaufend vom Ausführungsregister, das Daten für die geschützte Speicheradresse
hält, aktualisiert,
so dass Ladungen von dieser Speicheradresse zu anderen Adressen
stets aktuell sind und nicht geprüft werden müssen. Doch Speicherungen an
der Speicheradresse können
die Daten im Ausführungseinheitsregister 112 ungültig machen,
weshalb diese Speicherungen geprüft
werden müssen. Wenn
eine Speicherung an eine geschützte
Adresse erfolgt und deren Bytemaske zeigt, dass Daten an einem geschützten Byte
an der Speicheradresse, die im Vergleicher 120 gehalten
wird, gespeichert werden, erzeugt der Vergleicher in der Durchschreibe-Betriebsart
eine Replizierungsausnahme, um Speicherungen zu prüfen.
-
Wenn
die Betriebsart andererseits auf einen Zurückschreibezustand gestellt
ist, wird die Speicheradresse nur aktualisiert, wenn die Replizierungshardware
freigegeben wird, oder wenn Ausnahmen auftreten. Folglich können die
Daten an der Speicheradresse alt sein, weshalb sowohl Ladungen als
auch Speicherungen geprüft
werden müssen,
wenn die Replizierungshardware aktiviert wird. Um dies zu bewerkstelligen,
erzeugt der Vergleicher eine Ausnahme, wenn entweder eine Ladung
oder eine Speicherung an eine geschützte Adresse erfolgt und ihre
Bytemaske zeigt, dass an einem geschützten Byte an der Speicheradresse,
die im Vergleicher 120 gehalten wird, ein Zugriff auf Daten
erfolgt.
-
Eine
Ausnahme, die in einer der Betriebsarten erzeugt wurde, stellt ein
entsprechendes Bit im Replizierungsfehlerregister 126,
um die Adresse, die die Ausnahme verursacht, zu bezeichnen. Abhängig vom
bestimmten Ausnahmebehandlungsprogramm der Codeformungssoftware
kann die bestimmte Ausnahme, die erzeugt wurde, eine Reparatur oder
eine Rückführung vornehmen,
um das Problem zu korrigieren. Eine Reparatur des Problems verursacht,
dass die aktuellsten Daten in die bestimmten betroffenen Bytes des
Ausführungseinheitsdatenregisters
und der Speicheradresse gestellt werden. Eine Rückführung verursacht, dass der Zustand
der Register durch den Zustand, der in den Zielregistern gehalten
wird, ersetzt wird; dies beinhaltet den Zustand des Aktivierungsregisters 124,
der zum Zustand, der im Register 125 gehalten wird, zurückgeführt wird.
-
Die
Verwendung von Replizierungsfeststellungshardware, um Optimierungen
zu gestatten, die Ladungen und Speicherungen beseitigen, und um
abhängig
von den beseitigten Ladungen und Speicherungen auch die Neuanordnung
oder Neuplanung von Tätigkeiten
zu gestatten, wurde beschrieben. Die Neuanordnung ermöglicht eine
bessere Planung von Tätigkeiten
in einer Maschine mit parallelen Ausführungsbetriebsmitteln, wie
etwa einer superskalaren oder einer VLIW-Maschine.
-
Das
Verfahren kann auch verwendet werden, um die sichere Neuanordnung
von Tätigkeiten
abhängig von
Ladungen oder Speicherungen zu gestatten, ohne die Lade- oder Speicherungstätigkeiten
zu beseitigen. Dies verbessert das Planungsleistungsverhalten und
ist für
einen Code nützlich,
bei dem es keine Wiederholung von Lade- oder Speicherungstätigkeiten
gibt.
-
Fachleute
werden erkennen, dass der Mikroprozessor in einer Schaltung mit
typischen Computerelementen verbunden sein kann, um einen Computer
wie den in 9 veranschaulichten zu bilden.
Wie ersichtlich ist, wird der Mikroprozessor bei einer Verwendung
in einem modernen X86-Computer von einem Prozessorbus zum Speicher
und zum Bussteuerungsschaltsystem begleitet. Der Speicher und das
Bussteuerungsschaltsystem sind dazu eingerichtet, einen Zugriff
auf den Hauptspeicher wie auch auf den Pufferspeicher, der mit dem
Mikroprozessor benutzt werden kann, bereitzustellen. Der Speicher
und das Bussteuerungsschaltsystem stellen auch einen Zugriff auf
einen Bus wie eine PCI oder einen anderen lokalen Bus bereit, durch
den auf E/A-Vorrichtungen zugegriffen werden kann. Das spezifische
Computersystem wird vom Schaltsystem abhängen, das mit einem typischen
Mikroprozessor, den der vorliegende Mikroprozessor ersetzt, benutzt
wird.
-
Um
den Betrieb des Prozessors und die Weise, auf die die Beschleunigung
der Ausführung
auftritt, zu veranschaulichen, wird an diesem Punkt die Übersetzung
eines kleinen Beispiels eines X86-Zielcodes in Hostbasisbefehle
geboten. Das Beispiel veranschaulicht die Übersetzung von X86-Zielbefehlen
in Formungshostbefehle einschließlich verschiedener beispielhafter
Schritte des Optimierens, Neuanordnens, und Neuplanens durch den
Mikroprozessor, der die Erfindung beinhaltet. Durch Verfolgen des
veranschaulichten Prozesses werden Fachleuten die wesentlichen Unterschiede
zwischen den Tätigkeiten,
die erforderlich sind, um die ursprünglichen Befehle unter Verwendung
des Zielprozessors auszuführen,
und den Tätigkeiten,
die erforderlich sind, um die Übersetzung
am Hostprozessor auszuführen,
offensichtlich werden.
-
Der
ursprüngliche
Befehl, der im Sprachenquellcode C veranschaulicht ist, beschreibt
eine sehr kurze Schleifentätigkeit.
Im Wesentlichen wird, während
einige Variablen „n", die nach jeder
Schleife verringert werden, größer als „0" bleiben, ein Wert „c" an einer Adresse
gespeichert, die durch einen Zeiger „*s" angegeben ist, der nach jeder Schleife
erhöht
wird.
-
-
Anmerkung:
[...] gibt einen Adressenausdruck für einen Operand an. Im obigen
Beispiel wird die Adresse für
einen Speicheroperand aus den Inhalten eines Registers, die zu einer
durch das Ox-Präfix
angegebenen hexadezimalen Konstanten hinzugefügt werden, gebildet. Zielregister
sind mit dem Präfix
angegeben, z.B. ist %ecx das Register ecx. Das Ziel einer Tätigkeit
befindet sich links.
-
-
In
diesem ersten Abschnitt des Beispiels wird jeder der einzelnen X86-Assembliersprachenbefehle zum
Ausführen
der Ausführung
der Tätigkeit,
die durch die C-Sprachen-Angabe definiert ist, durch die Assembliersprache
mnemonisch für
die Tätigkeit
aufgelistet, worauf die Parameter, die an der bestimmten Basistätigkeit
beteiligt sind, folgen. Für
jeden Befehl wird in einem Kommentar auch eine Erklärung der
Tätigkeit
bereitgestellt. Auch wenn die Reihenfolge der Ausführung durch
den Zielprozessor von der gezeigten abgeändert werden kann, muss jeder
dieser Assembliersprachenbefehle jedes Mal ausgeführt werden,
wenn die Schleife bei der Ausführung
der Ziel-C-Sprachen-Befehle ausgeführt wird. Wenn die Schleife
einhundert Mal ausgeführt
wird, muss daher jeder oben gezeigte Befehl einhundert Mal ausgeführt werden.
-
Zeigt
jeden oben gezeigten X86-Befehl gefolgt von den Hostbefehlen, die
nötig sind,
um den X86-Befehl auszuführen.
-
-
-
Das
nächste
Beispiel veranschaulicht die gleichen Zielbasisbefehle, die die
C-Sprachen-Befehle ausführen.
Im Anschluss an jeden Basiszielbefehl sind jedoch Basishostbefehle
aufgelistet, die benötigt
werden, um die gleiche Tätigkeit
in einer bestimmten Ausführungsform
des Mikroprozessors zu bewerkstelligen, in der der Formungshost
ein VLIW-Prozessor ist, der auf die hierin beschriebene Weise gestaltet
ist. Es sollte bemerkt werden, dass die Hostregister, die durch
offizielle Zielregister beschattet werden, durch ein „R" gefolgt von der
Bezeichnung des X86-Registers
bezeichnet werden, so dass, zum Beispiel, Reax das Arbeitsregister ist,
das mit dem offiziellen Zielregister EAX verbunden ist.
-
Fügt Hostbefehle
hinzu, die nötig
sind, um X86-Adressberechnungen und obere und untere Segmentgrenzenprüfungen durchzuführen.
-
-
-
-
Das
nächste
Beispiel veranschaulicht für
jeden der Basiszielbefehle die Hinzufügung von Hostbasisbefehlen,
durch die Adressen, die für
die Zieltätigkeit
benötigt
werden, durch die Codeformungssoftware erzeugt werden können. Es
sollte bemerkt werden, dass Hostadressenerzeugungsbefehle nur in
einer Ausführungsform
eines Mikroprozessors benötigt
werden, in der eine Codeformungssoftware anstelle von Adressenerzeugungshardware
zur Adressenerzeugung verwendet wird. In einem Zielprozessor wie
etwa einem X86-Prozessor werden diese Adressen unter Verwendung
von Adressenerzeugungshardware erzeugt. Wann immer in einer derartigen
Ausführungsform
eine Adressenerzeugung stattfindet, wird die Berechnung bewerkstelligt;
und es werden auch Hostbasisbefehle hinzugefügt, um die Adressenwerte zu
prüfen,
um zu bestimmen, dass die berechneten Adressen innerhalb der passenden
X86-Segmentgrenzen liegen.
-
Fügt Befehle
hinzu, um den Ziel-X86-Befehlszeiger „eip" und die Übergabebefehle, die die besondere Formungshosthardware
verwenden, um den X86-Zustand zu aktualisieren, zu behalten.
-
-
-
-
Dieses
Beispiel veranschaulicht die Hinzufügung von zwei Schritten zu
jedem Satz von Basishostbefehlen, um die offiziellen Zielregister
nach der Ausführung
der Hostbefehle, welche nötig
sind, um jeden Basiszielbefehl auszuführen, zu aktualisieren, und
um die nichtübergebenen
Werte im torgesteuerten Speicherungspuffer zum Speicher zu übergeben.
Wie ersichtlich ist, wird in jedem Fall die Länge des Zielbefehls zum Wert
im Arbeitsbefehlszeigerregister (Reip) hinzugefügt. Dann wird ein Übergabebefehl
ausgeführt.
In einer Ausführungsform
kopiert der Übergabebefehl
den gegenwärtigen
Wert jedes Arbeitsregisters, das beschattet wird, in sein zugehöriges offizielles
Zielregister, und verschiebt er einen Zeigerwert, der die Position
des Tors des torgesteuerten Speicherungspuffers bezeichnet, von
unmittelbar vor den nichtübergebenen
Speicherungen zu unmittelbar hinter diesen Speicherungen, so dass
diese in den Speicher gestellt werden.
-
Man
wird verstehen, dass die Liste der Befehle, die oben als letztes
veranschaulicht ist, alle Befehle sind, die nötig sind, um eine Hostübersetzung
der ursprünglichen
Zielassembliersprachenbefehle zu bilden. Wenn die Übersetzung
an diesem Punkt anhalten sollte, wäre die Anzahl der Basishostbefehle
viel größer als die
Anzahl der Zielbefehle (wahrscheinlich sechs Mal so viele Befehle),
und könnte
die Ausführung
länger
als die Ausführung
an einem Zielprozessor dauern. Doch an diesem Punkt hat noch keine
Neuanordnung, Optimierung, oder Neuplanung stattgefunden.
-
Wenn
ein Befehl nur einmal ausgeführt
werden soll, kann es sein, dass die Zeit, die benötigt wird,
um eine weitere Neuanordnung oder eine andere Optimierung zu bewerkstelligen,
größer als
die Zeit zur Ausführung
der Übersetzung,
wie sie an diesem Punkt besteht, ist. Falls dies der Fall ist, beendet
eine Ausführungsform
des Mikroprozessors die Übersetzung
an diesem Punkt, speichert sie die Übersetzung, und führt sie
diese dann aus, um zu bestimmen, ob Ausnahmen oder Fehler auftreten.
In dieser Ausführungsform
finden Schritte einer Neuanordnung und einer anderen Optimierung
nur statt, wenn bestimmt wird, dass die bestimmte Übersetzung
eine Anzahl von Malen ausgeführt
werden wird oder anderweitig optimiert werden sollte. Dies kann zum
Beispiel bewerkstelligt werden, indem in jede Übersetzung Hostbefehle gestellt
werden, welche die Anzahl von Malen, die eine Übersetzung ausgeführt wird,
zählen
und eine Ausnahme (oder eine Verzweigung) erzeugen, wenn ein bestimmter
Wert erreicht ist. Die Ausnahme (oder die Verzweigung) überträgt die Tätigkeit zur
Codeformungssoftware, die dann einige oder alle der folgenden Optimierungen
und jegliche zusätzlichen Optimierungen,
die für
diese Übersetzung
als nütz lich
bestimmt wurden, ausführt.
Ein zweites Verfahren zur Bestimmung, dass Übersetzungen eine Anzahl von
Malen ausgeführt
werden und eine Optimierung benötigen, ist,
die Ausführung
der Übersetzung
mit einer bestimmten Frequenz oder auf irgendeiner statistischen
Basis zu unterbrechen und jegliche Übersetzung, die zu dieser Zeit
ausgeführt
wird, zu optimieren. Dies würde
letztendlich dafür
sorgen, dass die Befehle, die am häufigsten ausgeführt werden,
optimiert würden.
Eine andere Lösung
wäre, jeden
von bestimmten besonderen Arten von Hostbefehlen wie etwa jene,
die Schleifen erzeugen oder anderweitig wahrscheinlich am häufigsten
ausgeführt
werden, zu optimieren.
-
Optimierung
-
Nimmt
32-Bit flachen Adressenraum an, der die Beseitigung von Segmentbasishinzufügungen und
einigen Grenzenprüfungen
gestattet.
-
-
-
Dieses
Beispiel veranschaulicht eine erste Stufe der Optimierung, die unter
Benutzung des verbesserten Mikroprozessors ausgeführt werden
kann. Diese Stufe der Optimierung nimmt wie viele andere der Tätigkeiten
der Codeformungssoftware ein optimistisches Ergebnis an. Die besondere
Optimierung nimmt an, dass ein Zielanwendungsprogramm, das als ein
32-Bit-Programm für
ein Flachspeichermodell geschrieben wurde, welches durch die Prozessorfamilie
X86 bereitgestellt wird, als ein derartiges Programm weiterbestehen
wird. Es wird bemerkt werden, dass eine derartige Annahme für die Familie
X86 speziell ist und nicht notwendigerweise mit anderen Familien
von Prozessoren, die emuliert werden, angenommen würde. Wenn
diese Annahme getroffen wird, werden in X86-Anwendungen alle Segmente
auf den gleichen Adressenraum abgebildet. Dies gestattet, dass jene
Basishostbefehle, die durch den X86-Segmentierungsprozess benötigt werden,
beseitigt werden. Wie ersichtlich ist, werden die Segmentwerte zuerst
auf Null gesetzt. Dann wird die Basis für Daten auf Null gesetzt und
die Grenze auf den maximalen verfügbaren Speicher gesetzt. Dann
wird in jedem Satz von Basishostbefehlen zur Ausführung eines
Zielbasisbefehls sowohl die Prüfung
hinsichtlich des Segmentbasiswerts als auch die Berechnung der Segmentbasisadresse,
die durch die Segmentierung benötigt wird,
beseitigt. Dies verringert die auszuführende Schleife für jeden
Zielbasisbefehl, der eine Adressierungsfunktion benötigt, um
zwei Hostbasisbefehle. An diesem Punkt ist die Hostbefehlsprüfung hinsichtlich
der oberen Speichergrenze nach wie vor vorhanden.
-
Es
sollte bemerkt werden, dass diese Optimierung die erwähnte Spekulation
erfordert, dass die Anwendung ein 32-Bit-Flachspeichermodell benutzt. Wenn
dies nicht zutrifft, wird der Fehler entdeckt werden, wenn die Hauptschleife
den Bestimmungsort von Steuerungsübertragungen auflöst und feststellt,
dass die Quellenannahmen nicht den Bestimmungsortannahmen entsprechen.
Dann wird eine neue Übersetzung
nötig sein.
Diese Technik ist sehr allgemein und kann auf eine Vielfalt von
Segmentierungen und andere „betriebsartgemäße" Fälle angewendet
werden, in denen sich die "Betriebsart" selten verändert, wie
etwa der Fehlersuche, der Systemmanagementbetriebsart, oder der „echten" Betriebsart.
-
Es
wird angenommen, dass adressierte Daten keine Bytes außerhalb
von Computerspeichergrenzen beinhalten, was nur an nicht ausgerichteten
Seitenübergangsspeicherbezügen an der
oberen Speichergrenze auftreten kann, und durch Sonderfallsoftware
oder -hardware behandelt werden kann.
-
-
-
-
Das
obige Beispiel veranschaulicht eine nächste Stufe der Optimierung,
in der eine spekulative Übersetzung
die obere Speichergrenzenprüfung
beseitigt, die nur für
nicht ausgerichtete Seitenübergangsspeicherbezüge an der
Spitze des Speicheradressenraums nötig ist. Ein Versagen dieser
Annahme wird entweder durch einen Hardware- oder einen Softwareausrichtungs-Fixup
festgestellt. Dies verringert die Übersetzung für jeden
Zielbasisbefehl, der eine Adressierung benötigt, um einen anderen Hostbasisbefehl.
Diese Optimierung erfordert sowohl die vorher angeführte Annahme,
dass die Anwendung ein 32-Bit-Flachspeichermodell verwendet, als
auch die Spekulation, dass der Befehl ausgerichtet ist. Wenn dies
nicht beides zutrifft, wird die Übersetzung
scheitern, wenn sie ausgeführt
wird, und wird eine neue Übersetzung
nötig sein.
-
Stelle
redundante Adressenberechungen fest und beseitige sie. Das Beispiel
zeigt den Code nach dem Beseitigen der redundanten Tätigkeiten.
-
-
-
Dieses
Beispiel veranschaulicht eine nächste
Optimierung, in der gemeinsame Hostausdrücke beseitigt werden. Genauer
wird beim Übersetzen
des zweiten Zielbasisbefehls ein Wert im Arbeitsregister Rebp (das
Arbeitsregister, das das Stapelbasispunktregister eines X86-Prozessors
darstellt) zu einem Versatzwert 0 × 8 addiert und in ein Hostarbeitsregister
R2 gestellt. Man wird bemerken, dass die gleiche Tätigkeit
beim Neuübersetzen
des Zielbasisbefehls Fünf
im vorhergehenden Beispiel stattgefunden hat, außer dass das Ergebnis der Addition
in das Arbeitsregister R5 gestellt wurde. Folglich ist der Wert,
der in das Arbeitsregister R5 gestellt werden soll, bereits im Arbeitsregister
R2 vorhanden, wenn der Hostbasisbefehl Fünf im Begriff steht, aufzutreten.
Daher kann der Hostadditionsbefehl aus der Übersetzung des Zielbasisbefehls
Fünf beseitigt
werden; und kann de Wert im Arbeitsregister R2 in das Arbeitsregister
R5 kopiert werden. In der gleichen Weise kann ein Hostbefehl, der
einen Wert im Arbeitsregister Rebp zu einem Versatzwert 0 × 10 addiert,
in der Übersetzung
des Zielbasisbefehls Acht beseitigt werden, da der Schritt bereits
in der Übersetzung
des Zielbasisbefehls Sechs bewerkstelligt wurde und sich das Ergebnis
im Register R7 befindet. Es sollte bemerkt werden, dass diese Optimierung
nicht von einer Spekulation abhängt
und folglich nicht einem Versagen und einer Neuübersetzung unterliegt.
-
Es
wird angenommen, dass in der Übersetzung
keine Zielausnahmen auftreten werden, weshalb das Aktualisieren
von eip und dem Zielzustand verzögert
wird.
-
-
-
Das
obige Beispiel veranschaulicht eine Optimierung, die spekuliert,
dass die Übersetzung
der Basiszielbefehle, die die gesamte Übersetzung aufbauen, ohne Erzeugung
einer Ausnahme bewerkstelligt werden kann. Wenn dies zutrifft, besteht
keine Notwendigkeit, die offiziellen Zielregister zu aktualisieren
oder die nicht übergebenen
Speicherungen im Speicherungspuffer am Ende der Abfolge von Hostbasisbefehlen,
die einen einzelnen Zielbasisbefehl ausführt, zu übergeben. Wenn die Spekulation
gilt, müssen
die offiziellen Zielregister nur am Ende der Abfolge von Zielbasisbe fehlen
aktualisiert werden und müssen
die Speicherungen nur einmal zu dieser Zeit übergeben werden. Dies gestattet
die Beseitigung von zwei Basishostbefehlen zur Ausführung jedes
Basiszielbefehls. Sie werden durch einen einzelnen Hostbasisbefehl
ersetzt, der die offiziellen Zielregister aktualisiert und die nicht übergebenen
Speicherungen dem Speicher übergibt.
-
Wie
man verstehen wird, ist dies eine andere spekulative Tätigkeit,
die ebenfalls sehr wahrscheinlich mit einer richtigen Spekulation
verbunden ist. Dieser Schritt bietet gegenüber allen Emulationstechniken
des Stands der Technik einen sehr großen Vorteil, wenn die Spekulation
zutrifft. Er gestattet, dass alle der Basishostbefehle, die die
gesamte Abfolge von Zielbasisbefehlen ausführen, in eine Abfolge gruppiert
werden, in der alle der einzelnen Hostbasisbefehle gemeinsam optimiert
werden können.
Dies weist den Vorteil auf, dass es gestattet, dass eine große Anzahl
von Tätigkeiten
parallel an einem Formungshost ausgeführt wird, der die Techniken
des sehr langen Befehlsworts ausnutzt. Er gestattet auch, dass eine
größere Anzahl
von anderen Optimierungen vorgenommen wird, da mehr Wahlmöglichkeiten
für derartige
Optimierungen bestehen. Doch erneut halten die offiziellen Zielregister
und der Speicher den offiziellen Zielzustand, der am Beginn der
Abfolge von Zielbasisbefehlen bestand, wenn sich die Spekulation
als unrichtig erweist und bei der Ausführung der Schleife eine Ausnahme
vorgenommen wird, da keine Übergabe
stattfindet, bis die Abfolge der Hostbefehle tatsächlich ausgeführt ist.
Alles, was nötig
ist, um sich von einer Ausnahme zu erholen, ist, die nichtübergebenen
Speicherungen zu verwerfen, die offiziellen Register in die Arbeitsregister
zurückzuführen, und
die Übersetzung
der Zielbasisbefehle am Beginn der Abfolge neu zu beginnen. Diese
Neuübersetzung
erzeugt eine Übersetzung
eines Zielbefehls nach dem anderen, und der offizielle Zustand wird
aktualisiert, nachdem die Hostabfolge, die jeden Zielbasisbefehl
darstellt, übersetzt worden
ist. Diese Übersetzung
wird dann ausgeführt.
Wenn die Ausnahme an dieser Neuübersetzung
auftritt, ist der richtige Zielzustand sofort in den offiziellen
Zielregistern und im Speicher verfügbar, um die Ausnahme auszuführen. Zusammengefasst:
-
Die
Anmerkung „Live
Out" bezieht sich
auf die Notwendigkeit, Reax und Recx vor der Übergabe tatsächlich richtig
zu erhalten. Andernfalls könnte
eine weitere Optimierung möglich
sein.
-
Die
obige Zusammenfassung veranschaulicht die Abfolge von Hostbasisbefehlen,
die an diesem Punkt im Optimierungsprozess verbleiben. Obwohl dieses
Beispiel die Erhaltung des Zielbefehlszeigers (EIP) in der Reihe
zeigt, ist es möglich,
den Zeiger EIP für
Verzweigungen aus der Reihe zur Zeit der Übersetzung zu erhalten, was
die Aktualisierungsabfolge für
den Zeiger EIP daraus und aus anschließenden Schritten des Beispiels
entfernen würde.
-
Umbenennen
zur Verringerung von Registerbetriebsmittelabhängigkeiten. Dies wird gestatten,
dass die anschließende
Planung leistungsfähiger
ist. Von diesem Punkt an wird der ursprüngliche Ziel-X86-Code weggelassen,
da die Beziehung zwischen einzelnen Ziel-X86-Befehlen und Hostbefehlen
zunehmend verschwommen wird.
-
-
Dieses
Beispiel veranschaulicht einen nächsten
Schritt der Optimierung, der normalerweise als „Registerumbenennung" bezeichnet wird,
und in dem Tätigkeiten,
die Arbeitsregister erfordern, welche für mehr als eine Tätigkeit
in der Abfolge der Hostbasisbefehle verwendet werden, geändert werden,
um ein anderes unbenutztes Arbeitsregister zu benutzen, um die Möglichkeit
zu beseitigen, dass zwei Hostbefehle die gleiche Hardware benötigen werden.
Daher verwendet zum Beispiel der zweite Hostbasisbefehl in zwei
obigen Beispielen ein Arbeitsregister Recx, das ein offizielles
Zielregister ECX darstellt. Der zehnte Hostbasisbefehl verwendet
ebenfalls das Arbeitsregister Recx. Durch das Ändern der Tätigkeit im zweiten Hostbasisbefehl,
damit der Wert, auf den durch die Adresse in R0 gezeigt wird, im
Arbeitsregister R1 anstatt im Register Recx gespeichert wird, verwenden
die beiden Hostbefehle nicht beide das gleiche Register. In der
gleichen Weise benutzen der vierte, fünfte, und sechste Hostbasisbefehl
im früheren
Beispiel alle das Arbeitsregister Reax; durch das Ändern des
vierten Hostbasisbefehls, um das vorher nicht verwendete Arbeitsregister
R3 anstatt das Arbeitsregister Reax zu benutzen, und des sechsten
Basisbefehls, um das vorher nicht verwendete Arbeitsregister R4
anstatt des Registers Reax zu benutzen, werden diese Hardwareabhängigkeiten
beseitigt.
-
Nach
dem Planungsprozess, der die Basishosttätigkeiten als mehrere Tätigkeiten
organisiert, die an der Host-VLIW-Hardware parallel ausgeführt werden
können.
Jede Zeile zeigt die parallelen Tätigkeiten, die die VLIW-Maschine
ausführt,
und das „&" gibt die Parallelität an.
-
-
Das
obige Beispiel veranschaulicht die Planung der Hostbasisbefehle
zur Ausführung
am Formungshost. In diesem Beispiel wird angenommen, dass der Formungshost
ein VLIW-Prozessor
ist, der zusätzlich
zu den Hardwareverbesserungen, die für das Zusammenwirken mit der
Codeformungssoftware bereitgestellt sind, unter anderen Verarbeitungseinheiten
auch zwei arithmetisch-logische Einheiten (ALU) beinhaltet. Die erste
Zeile veranschaulicht zwei einzelne Addierbefehle, die so geplant
wurden, dass sie gemeinsam am Formungshost ausgeführt werden.
Wie ersichtlich ist, handelt es sich dabei um den dritten und den
achten Basishostbefehl im Beispiel gerade vor der obigen Zusammenfassung.
Die zweite Zeile beinhaltet einen NOP-Befehl (keine Tätigkeit,
aber gehe zum nächsten
Befehl) und einen anderen Addierbefehl. Der NDP-Befehl veranschaulicht,
dass selbst nach dem Stattfinden irgendeiner Planungsoptimierung
nicht immer zwei Befehle vorhanden sind, die gemeinsam ausgeführt werden
können.
In jedem Fall veranschaulicht dieses Bei spiel, dass an diesem Punkt
nur neun Sätze
von Basishostbefehlen verblieben sind, um die ursprünglichen
zehn Zielbefehle auszuführen.
-
Hostverzweigungsziele
und kettengespeicherte Übersetzungen
werden aufgelöst.
-
-
Dieses
Beispiel veranschaulicht im Wesentlichen den gleichen Satz von Hostbasisbefehlen,
außer dass
die Befehle nun im Übersetzungspuffer
gespeichert wurden und ein- oder mehrmals ausgeführt wurden, da der letzte Sprungbefehl
(jg) nun zu einer Sprungadresse zeigt, die durch das Verketten mit
einer anderen Abfolge von übersetzten
Befehlen geliefert wird. Der Verkettungsprozess nimmt die Abfolge
der Befehle aus der Übersetzerhauptschleife,
so dass die Übersetzung
der Abfolge abgeschlossen wurde.
-
Fortgeschrittene Optimierungen,
Rückwärtscodebewegung:
-
Dieses
und nachfolgende Beispiele beginnen mit dem Code vor dem Planen.
Diese Optimierung hängt zuerst
von der Feststellung ab, dass der Code eine Schleife ist. Dann können unveränderliche
Tätigkeiten
aus dem Schleifenkörper
verschoben werden und einmal ausgeführt werden, bevor in den Schleifenkörper eingetreten
wird.
-
-
Das
obige Beispiel veranschaulicht einen fortgeschrittenen Optimierungsschritt,
der gewöhnlich
nur mit Abfolgen verwendet wird, die eine große Anzahl von Malen wiederholt
werden sollen. Der Prozess stellt zuerst Übersetzungen fest, die Schleifen
bilden, und überprüft die einzelnen
Basishostbefehle, um zu bestimmen, welche Befehle im Schleifenkörper konstante
Ergebnisse erzeugen. Diese Befehle werden aus der Schleife entfernt
und nur einmal ausgeführt,
um einen Wert in ein Register zu stellen; von diesem Punkt an wird
anstelle einer Neuausführung
des Befehls der Wert im Register verwendet.
-
Plane den Schleifenkörper nach
der Rückwärtscodebewegung.
-
Zu
Beispielszwecken ist nur der Code im Schleifenkörper geplant gezeigt.
-
-
Wenn
diese sich nicht wiederholenden Befehle aus der Schleife entfernt
werden und die Abfolge zur Ausführung
geplant wird, erscheinen die geplanten Befehle wie im letzten obigen
Beispiel. Es ist ersichtlich, dass die anfänglichen Befehle nur einmal
während
der ersten Iteration der Schleife ausgeführt werden und danach nur die
Hostbasisbefehle, die in den gezeigten sieben Taktintervallen verbleiben,
während
der Schleife ausgeführt
werden. Dadurch wurde die Ausführungszeit
von den zehn Befehlen, die nötig
sind, um die Basiszielbefehle auszuführen, auf sieben Befehlsintervalle
verringert.
-
Wie
ersichtlich ist, sind die Schritte, die aus der Schleife entfernt
wurden, Adressenerzeugungsschritte. Daher muss die Adressenerzeugung
im verbesserten Mikroprozessor nur einmal pro Schleifenaufruf vorgenommen
werden, das heißt,
muss die Adressenerzeugung nur einmal vorgenommen werden. Andererseits muss
die Adressenerzeugungshardware des X86-Zielprozessors diese Adressen
jedes Mal erzeugen, wenn die Schleife ausgeführt wird. Wenn eine Schleife
einhundert Mal ausgeführt
wird, erzeugt der verbesserte Mikroprozessor die Adressen nur einmal,
während
ein Zielprozessor jede Adresse einhundert Mal erzeugen würde.
-
Nach
der Rückwärtscodebewegung:
-
Registerzuteilung:
-
Dies
zeigt die Verwendung einer Registerreplizierungsfeststellungshardware
des Formungshosts, die gestattet, das Variablen sicher vom Speicher
in Register verschoben werden. Der Ausgangspunkt ist der Code nach
der „Rückwärtscodebewegung". Dies zeigt die
Optimierung, die Ladungen beseitigen kann.
-
Zuerst
werden die Ladungen durchgeführt.
Die Adresse wird durch die Replizierungshardware geschützt, so
dass eine „Replizierungs" ausnahme erzeugt
wird, falls eine Speicherung an die Adresse stattfindet. Die Ladungen
im Schleifenkörper
werden dann durch Kopien ersetzt. Nach dem Hauptkörper der
Schleife wird die Replizierungshardware freigegeben.
-
-
Dieses
Beispiel veranschaulicht eine noch fortgeschrittenere Optimierung,
die durch den Mikroprozessor, der die vorliegende Erfindung beinhaltet,
ausgeführt
werden kann. Unter erneuter Bezugnahme auf das zweite Beispiel vor
diesem Beispiel wird bemerkt werden, dass die ersten drei Addierbefehle
mit Berechnungsadressen am Stapel verbunden waren. Diese Adressen ändern sich
während
der Ausführung
der Abfolge von Hostbefehlen nicht. Folglich können die Werte, die an diesen
Adressen gespeichert sind, aus dem Speicher abgerufen werden und
in Register geladen werden, wo sie sofort zur Ausführung verfügbar sind.
Wie ersichtlich ist, erfolgt dies in den Hostbasisbefehlen Sechs, Acht,
und Zehn. In Befehl Sieben, Neun und Elf wird jede der Speicheradressen
durch eine besondere Hostreplizierungshardware als geschützt gekennzeichnet,
und werden die Register als Replizierungen für diese Speicheradressen angegeben,
so dass jeglicher Versuch, die Daten zu ändern, eine Ausnahme erzeugen
wird. An diesem Punkt wird jede der Ladetätigkeiten, die das Verschieben
von Daten von diesen Stapelspeicheradressen umfasst, eine einfache
Kopiertätigkeit
von Register zu Register, die viel schneller als das Laden von einer
Speicheradresse abläuft.
Es sollte bemerkt werden, dass der Schutz von jeder der Speicheradressen
entfernt werden muss, sobald die Schleife bis n = 0 ausgeführt wurde,
damit die Replizierungsregister anderweitig benutzt werden können.
-
Kopienverbreitung:
-
Nach
dem Verwenden der Replizierungshardware, um Ladungen im Schleifenkörper in
Kopien zu verwandeln, gestattet die Kopienverbreitung die Beseitigung
einiger Kopien.
-
-
-
Dieses
Beispiel veranschaulicht die nächste
Stufe der Optimierung, in der erkannt wird, dass die meisten der
Kopierbefehle, die in der Optimierung, welche im letzten Beispiel
veranschaulicht wurde, die Ladebefehle ersetzten, unnötig sind
und beseitigt werden können.
Das heißt,
wenn eine Kopiertätigkeit
von Register zu Register stattfindet, waren die Daten vor der Tätigkeit
im Register vorhanden, aus dem die Daten kopiert wurden. Wenn dies
der Fall ist, kann statt in dem Register, in das sie kopiert werden,
im ersten Register auf die Daten zugegriffen werden und kann die
Kopiertätigkeit
beseitigt werden. Wie ersichtlich ist, beseitigt dies den ersten,
zweiten, fünften,
und neunten Basishostbefehl, die in der Schleife des letzten Beispiels
gezeigt sind. Zusätzlich
werden auch die Register, die in anderen der Hostbasisbefehle verwendet
werden, geändert, um
die richtigen Register für
die Daten widerzuspiegeln. Wenn zum Beispiel der erste und der zweite
Kopierbefehl beseitigt ist, muss daher der dritte Speicherungsbefehl
die Daten vom Arbeitsregister Rc, wo sie vorhanden sind (anstatt
im Register 1), kopieren und die Daten an die Adresse stellen, die
im Arbeitsregister Rs angegeben ist, wo die Adresse vorhanden ist
(anstatt im Register R3).
-
Ein
Beispiel, das die Planung nur des Schleifenkörpers veranschaulicht.
-
-
Die
geplanten Hostbefehle sind im obigen Beispiel veranschaulicht. Man
wird bemerken, dass die Abfolge derart ist, dass weniger Takte benötigt werden,
um die Schleife auszuführen,
als für
die Ausführung
des Basiszielbefehls, der ursprünglich
vom Quellcode decodiert wurde. Daher ist abgesehen von all den anderen bewerkstelligten
Beschleunigungen die gesamte Anzahl der kombinierten Tätigkeiten,
die auszuführen
sind, einfach geringer als die Tätigkeiten,
die nötig
sind, um den ursprünglichen
Zielcode auszuführen.
-
Speichere
die Beseitigung durch Verwendung der Replizierungshardware.
-
-
Die
letzte Optimierung, die in diesem Beispiel gezeigt ist, ist die
Verwendung der Replizierungshardware, um Speicherungen zu beseitigen.
Dies beseitigt die Speicherungen aus dem Schleifenkörper und
führt sie
nur im Schleifenepilog durch. Dies verringert die Anzahl der Hostbefehle
im Schleifenkörper
verglichen mit den ursprünglichen
zehn Zielbefehlen auf drei.
-
Obwohl
die Erfindung im Zusammenhang mit der Emulation von X86-Prozessoren
beschrieben wurde, sollte sich verstehen, dass die Erfindung ebenso
gut für
Programme, die für
andere Prozessorarchitekturen bestimmt sind, und Programme, die
an virtuellen Maschinen ausgeführt
werden, wie etwa P-Code-, Postscript-, und Java-Programme, gilt.