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?