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?