2013-07-11 2 views
5

In Java sind JVMs (z. B. HotSpot) zur JIT-Kompilierung fähig und diese Technik wird verwendet, um die Ausführung durch Kompilieren von Bytecode in nativen Code zu beschleunigen. Meine Frage ist, wie läuft das technisch ab? Mein Verständnis war, dass moderne Prozessoren Speicherbereiche in schreibgeschützte Abschnitte und ausführbare Abschnitte markieren, um die Ausführung von bösartigem Code zu verhindern. Daher kann die JVM nicht wirklich neuen "ausführbaren Code" in Speicherbereiche schreiben, auf die sie Zugriff hat (d. H. Sich selbst modifizierenden Code). Ich vermute also, dass die JVM nativen Code erzeugt, in eine Datei schreibt und dann die Betriebssystemdienste verwendet, um diesen systemeigenen Code dynamisch in den Speicher zu laden, und eine interne Zuordnungstabelle der Adressen der nativen Code- (Funktions-) Speicherorte führt im Speicher, nachdem das Betriebssystem diesen dynamischen Code geladen hat, um zu diesen systemeigenen Anweisungen verzweigen zu können.Wie lädt die JIT-Kompilierung in Java dynamisch kompilierte Anweisungen in den Speicher?

Ich habe diese Antwort gesehen: How is JIT compiled code injected in memory and executed?, aber ich bin verwirrt, warum Betriebssysteme Benutzerprogramme READ + EXECUTE Speicherbereiche erlauben würde. Haben andere Betriebssysteme, also Linux usw., etwas ähnliches, damit JIT funktioniert?

Kann jemand helfen, mein Verständnis zu klären?

Antwort

3

Unter Linux kann ein Speichersegment so eingerichtet werden, dass es beschreibbar und ausführbar ist (und später über seine Schutzfunktionen geändert werden kann). Schauen Sie sich die mmap(2) und mprotect(2) syscalls an.

Die JVM wird wahrscheinlich Maschinencode im Speicher erstellen, ohne irgendwelche Dateien zu verwenden. Seine JIT-Maschine schreibt wahrscheinlich nur Bytes in ausführbaren Speicher. Beachten Sie, dass die JVM den generierten Maschinencode-Schutz möglicherweise nicht ändern möchte (wahrscheinlich könnte sie den gesamten Maschinencode in beschreibbaren und ausführbaren Speichersegmenten generieren), da dieser Code selbst erzeugt werden kann nicht böse Dinge tun (lesen Sie über proof-carrying code).

Lesen Sie die Just-in-time compilation und HotSpot und Virtual Memory Wiki-Seiten und versuchen strace -ing einigen java Prozess ...

Einige JVMs sind freie Software (zum Beispiel eines im Inneren OpenJdk), können Sie den Quellcode studieren können.

Verwandte Themen