Wednesday, September 26, 2018

Textual description of firstImageUrl

Dynamische Rekompilierung - Wikipedia


In der Informatik dynamische Rekompilierung (manchmal als dynarec oder das Pseudo-Akronym DRC bezeichnet) ist ein Merkmal einiger Emulatoren und virtueller Maschinen, wo Das System kann einen Teil eines Programms während der Ausführung neu kompilieren. Durch die Kompilierung während der Ausführung kann das System den generierten Code an die Laufzeitumgebung des Programms anpassen und möglicherweise effizienteren Code erzeugen, indem er Informationen nutzt, die einem herkömmlichen statischen Compiler nicht zur Verfügung stehen.

Die meisten dynamischen Rekompiler werden verwendet, um zur Laufzeit Maschinencode zwischen Architekturen zu konvertieren. Dies ist eine Aufgabe, die häufig bei der Emulation älterer Spieleplattformen erforderlich ist. In anderen Fällen kann ein System eine dynamische Neukompilierung als Teil einer adaptiven Optimierungsstrategie verwenden, um eine tragbare Programmdarstellung, wie beispielsweise Java- oder .NET-Common Language Runtime-Bytecodes, auszuführen. Vollgeschwindigkeits-Debugger verwenden auch die dynamische Neukompilierung, um den Platzbedarf bei den meisten Deoptimierungstechniken und andere Funktionen wie die dynamische Thread-Migration zu reduzieren.

Die Hauptaufgaben, die ein dynamischer Rekompiler ausführen muss, sind:

  • Lesen des Maschinencodes von der Quellplattform
  • Senden des Maschinencodes für die Zielplattform

Ein dynamischer Rekompilierer kann auch einige zusätzliche Aufgaben ausführen:

  • Verwalten eines Cache von neu kompiliertem Code
  • Aktualisieren der Anzahl abgelaufener Zyklen auf Plattformen mit Zykluszählregistern
  • Verwaltung der Interruptprüfung
  • Bereitstellung einer Schnittstelle für virtualisierte Support-Hardware, beispielsweise einer GPU
  • Optimierung Ebenencodestrukturen zum effizienten Ausführen auf der Zielhardware (siehe unten)

Beispiel [ edit ]

Angenommen, ein Programm wird in einem Emulator ausgeführt und muss einen mit Null abgeschlossenen Vorgang kopieren Schnur Das Programm ist ursprünglich für einen sehr einfachen Prozessor kompiliert. Dieser Prozessor kann jeweils nur ein Byte kopieren, indem er es zuerst aus der Quellzeichenfolge in ein Register liest und dann aus diesem Register in die Zielzeichenfolge schreibt. Das Originalprogramm könnte ungefähr so ​​aussehen:

 Anfang:       mov   A [ erster   String   Zeiger ]     ; Platzierung des ersten Zeichens der Quellzeichenfolge                                      ; in Register A       mov   B  zweiter   String   Zeiger     ; Platzierung des ersten Zeichens der Zielzeichenfolge                                      ; in Register B   Schleife :       mov   C [ A              ; Kopieren Sie ein Byte an der Adresse in Register A in Register C       mov    B  C             ; Kopieren Sie das Byte in Register C an die Adresse in Register B       inc   A                 . Inkrementieren Sie die Adresse in Register A, um auf                            zu zeigen. das nächste Byte       Inc.   B                 ; Inkrementieren Sie die Adresse in Register B auf                           ; das nächste Byte       cmp   C  # 0; Vergleiche die Daten, die wir gerade kopiert haben, mit 0 (String-Endemarke)       jnz   -Schleife              ; Wenn es nicht 0 war, haben wir mehr zu kopieren, also gehen Sie zurück                           ; und kopieren Sie das nächste Byte   end :                      ; Wenn wir keine Schleife hätten, müssen wir beendet sein                           ; Machen Sie also mit etwas anderem weiter.  

Der Emulator wird möglicherweise auf einem Prozessor ausgeführt, der zwar ähnlich ist, aber extrem gut beim Kopieren von Zeichenfolgen ist, und der Emulator weiß, dass er dies nutzen kann. Möglicherweise erkennt sie die Folge der Anweisungen zum Kopieren von Zeichenfolgen und beschließt, sie kurz vor der Ausführung effizienter zu schreiben, um die Emulation zu beschleunigen.

Angenommen, es gibt eine Anweisung für unseren neuen Prozessor mit dem Namen movs die speziell für das effiziente Kopieren von Strings entwickelt wurde. Unser theoretischer movs-Befehl kopiert 16 Bytes gleichzeitig, ohne sie zwischendurch in das Register C laden zu müssen. stoppt jedoch, wenn es ein 0-Byte kopiert (das Ende eines Strings markiert) und das Null-Flag gesetzt. Es weiß auch, dass die Adressen der Zeichenfolgen in den Registern A und B liegen, so dass A und B bei jeder Ausführung um 16 erhöht werden und für die nächste Kopie bereit sind.

Unser neuer rekompilierter Code könnte ungefähr so ​​aussehen:

 Anfang:       mov   A [ erster   String   Zeiger ]     ; Platzierung des ersten Zeichens der Quellzeichenfolge                                      ; in Register A       mov   B  zweiter   String   Zeiger     ; Platzierung des ersten Zeichens der Zielzeichenfolge                                      ; in Register B   Schleife :       movs    B [ A              ; Kopieren Sie 16 Bytes an Adresse in Register A an Adresse                              ; in Register B, dann Inkrement von A und B um 16       jnz   -Schleife                 ; Wenn das Null-Flag nicht gesetzt ist, haben wir                               noch nicht erreicht. das Ende der Zeichenfolge, also gehen Sie zurück und kopieren Sie etwas mehr.   Ende :                         ; Wenn wir keine Schleife gemacht haben, müssen wir beendet sein                              ; Machen Sie also mit etwas anderem weiter.  

Es gibt einen unmittelbaren Geschwindigkeitsvorteil, nur weil der Prozessor nicht so viele Anweisungen laden muss, um dieselbe Aufgabe auszuführen, sondern auch, weil der Befehl movs wahrscheinlich vom Prozessorentwickler optimiert wird effizienter als die im ersten Beispiel verwendete Sequenz. Beispielsweise kann die parallele Ausführung im Prozessor besser genutzt werden, um A und B zu erhöhen, während noch Bytes kopiert werden.

Anwendungen [ edit ]

Allzweck [ edit ]

  • Viele virtuelle Maschinen von Java verfügen über eine dynamische Neukompilierung.
  • Apples Rosetta Mac OS X auf x86 ermöglicht die Ausführung von PowerPC-Code auf der x86-Architektur.
  • Spätere Versionen des Mac 68K-Emulators, der im klassischen Mac OS zum Ausführen von 680x0-Code auf der PowerPC-Hardware verwendet wird.
  • Psyco, ein spezialisierter Compiler für Python.
  • Das HP Dynamo-Projekt, ein Beispiel für einen transparenten binären dynamischen Optimierer. [1]
  • DynamoRIO, ein Open-Source-Nachfolger von Dynamo, der mit ARM, x86-64 und arbeitet IA-64 (Itanium) -Befehlssätze [2] [3]
  • Die virtuelle Maschine Vx32 verwendet dynamische Rekompilierung, um OS-unabhängige Sandboxen für x86-Architekturen für sichere Anwendungsplugins zu erstellen.
  • Microsoft Virtual PC für Mac, der zum Ausführen von x86-Code auf PowerPC verwendet wird.
  • QEMU, eine Open-Sour ce full system emulator.
  • FreeKEYB, ein internationaler DOS-Tastatur- und -Konsolentreiber mit vielen Verbesserungen der Benutzerfreundlichkeit, verwendet selbstmodifizierenden Code und dynamische Dead-Code-Eliminierung, um das im Speicher gespeicherte Abbild basierend auf seiner Benutzerkonfiguration (ausgewählte Funktionen, Sprachen, Layouts) zu minimieren ) und tatsächliche Laufzeitumgebung (Betriebssystemvariante und -version, geladene Treiber, zugrunde liegende Hardware), Abhängigkeiten automatisch auflösen, Codeabschnitte dynamisch auf Byte-Ebene-Granularität verschieben und neu kombinieren und Opstrings basierend auf semantischen Informationen, die im Quellcode bereitgestellt werden, optimieren Spezialwerkzeuge während der Montage und Profilinformationen zum Zeitpunkt des Ladens erhalten [4]
  • [5]
  • OVPsim, [6] ein frei verfügbarer vollständiger Systememulator.
  • VirtualBox verwendet Dynamische Rekompilierung.
  • Valgrind, ein Programmiertool für Speicher-Debugging, Erkennung von Speicherlecks und Profiling, verwendet die dynamische Rekompilierung

Gaming [ edit ]

  • MAME verwendet die dynamische Rekompilierung in seinen CPU-Emulatoren für MIPS, SuperH, PowerPC und sogar die Voodoo-Grafikverarbeitungseinheiten.
  • 1964, ein Nintendo 64 Emulator für x86-Hardware.
  • Wii64, ein Nintendo 64-Emulator für die Wii.
  • WiiSX, ein Sony PlayStation-Emulator für die Nintendo Wii.
  • Mupen64Plus, ein Nintendo 64-Emulator mit mehreren Plattformen ]
  • Yabause, ein plattformübergreifender Saturn-Emulator. [8]
  • Die Rückwärtskompatibilitätsfunktion der Xbox 360 (d. H Es wird weithin angenommen, dass für die ursprüngliche Xbox geschriebene Spiele dynamische Rekompilierung verwenden.
  • PPSSPP, ein tragbarer Emulator der PlayStation Portable von Sony. Recompiler für x86 und ARM.
  • PSEmu Pro, ein Sony PlayStation-Emulator.
  • Ultrahle, der erste Nintendo 64-Emulator, der kommerzielle Spiele vollständig ausführt.
  • PCSX2, [9] ein Sony PlayStation 2-Emulator Recompiler namens "microVU", der Nachfolger von "SuperVU".
  • Dolphin, ein Nintendo GameCube und Wii-Emulator, hat eine Dynarec-Option.
  • GCemu, [10] ein Nintendo GameCube-Emulator.
  • NullDC, ein Sega Dreamcast-Emulator für x86.
  • GEM, [11] ein Nintendo Game Boy-Emulator für MSX verwendet einen dynamischen Rekompilierer für die Optimierung.
  • DeSmuME, [12] ein Nintendo DS-Emulator, hat eine Dynarec-Option.
  • Soywiz's Psp [13] Ein Sony PlayStation Portable-Emulator verfügt über eine Dynarec-Option.
  • RPCS3, ein Sony PlayStation 3-Emulator. Rekompilierer, sowohl PPU als auch SPU auf Cell Processor für x86-64
  • Decaf-emu, ein Wii U-Emulator, verwendet die dynamische Rekompilierung (JIT) von PowerPC32 bis x86_64-Code-Hardware unter Verwendung der libbinrec-Bibliothek (die Bibliothek selbst kann auf einer beliebigen Hardwarearchitektur ausgeführt werden).

Siehe auch [ edit ]

Referenzen edit

  1. " " "HP Labs 'technischer Bericht über Dynamo".
  2. ^ http://www.dynamorio.org/home.html
  3. ^ https://github.com/DynamoRIO/dynamorio
  4. Paul, Matthias; Frinke, Axel C. (1997-10-13) [first published 1991] FreeKEYB - Verbesserter DOS-Tastatur- und Konsolentreiber (Benutzerhandbuch) (v6.5 ed.), NB. FreeKEYB ist ein auf Unicode basierender, dynamisch konfigurierbarer Nachfolger von K3PLUS, der die meisten Tastaturlayouts, Codeseiten und Ländercodes unterstützt. K3PLUS war zu seiner Zeit ein erweiterter Tastaturtreiber für DOS, der in Deutschland weit verbreitet war, mit Anpassungen an eine Handvoll anderer europäischer Sprachen. Sie unterstützte zwar bereits einen Teil der FreeKEYB-Funktionen, war jedoch statisch konfiguriert und unterstützte keine dynamische Code-Eliminierung.
  5. ^ Paul, Matthias; Frinke, Axel C. (2006-01-16), FreeKEYB - fortgeschrittener internationaler DOS-Tastatur- und -Konsolentreiber (Benutzerhandbuch) (v7 vorläufige Ausgabe)
  6. ^ "OVPsim". 19659169] ^ Mupen64Plus
  7. ^ SH2
  8. ^ PCSX 2.
  9. Petebernert. "GCemu". SourceForge .
  10. ^ "Gameboy-Emulator für MSX | The New Image". GEM . Abgerufen 2014-01-12 .
  11. ^ "DeSmuME v0.9.9".
  12. ^ Veröffentlicht von Carlos Ballesteros Velasco (2013-07-28). "Soywiz PSP Emulator: Release: Soywiz Psp Emulator 2013-07-28 (r525)". Pspemu.soywiz.com . 2014-01-12 .

Externe Links [ edit ]

No comments:

Post a Comment