Javaでは、JVM(例えば、HotSpot)はJITコンパイルが可能であり、この技法は、バイトコードをネイティブコードにコンパイルすることによって実行をスピードアップするために使用される。私の質問は、これは技術的にどのように起こるのでしょうか?私の理解では、最新のプロセッサーは、メモリー領域を読み取り専用のセクションと悪質なコードの実行を防ぐために実行可能なセクションにマークしていました。したがって、JVMはアクセス可能なメモリ空間(つまり自己修正コード)に実際に新しい "実行可能コード"を書き込むことはできません。したがって、JVMがネイティブコードを生成し、それをファイルに書き込んだ後、オペレーティングシステムサービスを使用してそのネイティブコードをメモリに動的にロードし、ネイティブコード(関数)の場所のアドレスの内部マッピングテーブルを維持することを推測していますオペレーティングシステムがこの動的コードをロードした後でメモリ内に格納され、それらのネイティブ命令に分岐することができます。JavaのJITコンパイルはどのように動的にコンパイルされた命令をメモリにロードしますか?
私はこの回答を見ました:How is JIT compiled code injected in memory and executed?ですが、なぜオペレーティングシステムがユーザープログラムにREAD + EXECUTEメモリ領域を許可するのか混乱しています。他のオペレーティングシステム、つまりLinuxなどは、JITが動作するために類似のものを提供していますか?
誰かが私の理解を明確にするのに役立つことができますか?