マシンコードJITと実行無効ビット


10

CPU / OSに実行無効ビットがある場合、ランタイム生成のマシンコード(JITの出力など)は実際にはどのようにCPUによって実行されますか?

私の知る限りでは、多くの最新のプロセッサおよびオペレーティングシステムは、NXのサポートは、任意のアドレスに格納されている防止マシンコード、(インテルおよびARMを含む)は、ビット含む他の実行中からコンパイルされたバイナリのコードセクションより。明らかに、これはシェルコードインジェクション攻撃を防ぐので、優れたセキュリティ上の利点です。

しかし、動的にマシンコードを生成するLLVMのようなJITエンジンはどうやってこれを回避するのでしょうか?


Memory :: allocateMappedMemoryの実装を見て、LLVMでどのように実行されるかを確認してください。- * nixのために - Windowsの場合
zr01

回答:


6

Linuxおよび多くのPosixシステムでは、アプリケーションは、mmap(2)およびmprotect(2) syscalls を使用して、仮想メモリ内のある範囲のプロセスアドレス空間の保護を変更できます。

したがって、JITエンジンはこれらを使用できます(おそらくマシンコードの発行ですが、おそらくその後)。

ところで、一部のアーキテクチャで__builtin_clear_cacheは、GCC などの新しく利用可能なマシンコードセグメントについてCPUキャッシュに通知する必要がある場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.