2013-07-11 17 views
5

W Javie maszyny JVM (np. HotSpot) są zdolne do kompilacji JIT, a technika ta służy do przyspieszenia wykonywania przez kompilację kodu bajtowego do kodu natywnego. Moje pytanie brzmi: jak to technicznie się dzieje? Rozumiem, że nowoczesne procesory wyznaczają obszary pamięci na sekcje, które są tylko do odczytu, oraz sekcje, które można wykonać w celu zapobiegania uruchamianiu złośliwego kodu. Tak więc JVM nie może naprawdę napisać nowego "kodu wykonywalnego" w przestrzeniach pamięci, do których ma dostęp (tj. Kod modyfikujący). Zgaduję więc, że JVM tworzy natywny kod, zapisuje go w pliku, a następnie wykorzystuje usługi systemów operacyjnych do dynamicznego ładowania tego natywnego kodu do pamięci i utrzymuje pewną wewnętrzną tablicę mapowania adresów macierzystego miejsca kodu (funkcji) w pamięci po tym, jak system operacyjny załadował ten dynamiczny kod, aby mógł rozgałęziać się do tych natywnych instrukcji.W jaki sposób kompilacja JIT w Javie ładuje dynamicznie skompilowane instrukcje do pamięci?

Widziałem tę odpowiedź: How is JIT compiled code injected in memory and executed?, ale nie rozumiem, dlaczego systemy operacyjne pozwoliłyby programom użytkownika READ + EXECUTE regiony pamięci. Czy inne systemy operacyjne, na przykład Linux itp. Oferują coś podobnego, aby JIT działał?

Czy ktoś może pomóc w zrozumieniu mojego zrozumienia?

Odpowiedz

3

W systemie Linux segment pamięci można skonfigurować do zapisu i wykonywania (i można go później zmienić na jego zabezpieczeniach). Spójrz na linie bazowe mmap(2) i mprotect(2).

JVM prawdopodobnie wygeneruje kod maszynowy w pamięci, bez używania żadnych plików dyskowych. Jego maszyna JIT prawdopodobnie po prostu zapisuje bajty w pamięci wykonywalnej.

Należy zauważyć, że JVM może nie chcieć zmienić wygenerowanego kodu ochronnego komputera (prawdopodobnie wygenerowałoby to cały kod maszynowy wewnątrz zapisywalnych i wykonywalnych segmentów pamięci), ponieważ ponieważ generuje sam ten kod, można go nie robienie nieprzyjemnych rzeczy (czytaj o proof-carrying code).

Czytaj stron wiki Just-in-time compilation i HotSpot i Virtual Memory i spróbuj strace -ing trochę java proces ...

Niektóre JVM są wolne oprogramowanie (na przykład jeden wewnątrz OpenJdk), można badać ich kod źródłowy.