Bagaimana kode mesin yang dihasilkan runtime (seperti output dari JIT), sebenarnya dieksekusi oleh CPU jika CPU / OS memiliki bit Nonaktifkan Eksekusi?
Sejauh yang saya tahu, banyak prosesor modern dan Sistem Operasi termasuk dukungan untuk NX bit, (termasuk Intel dan ARM), yang mesin mencegah kode yang disimpan di alamat lain selain bagian kode biner disusun dari yang dieksekusi. Jelas, ini adalah keuntungan keamanan yang bagus, karena mencegah serangan injeksi shell-code.
Tetapi bagaimana mesin JIT, seperti LLVM, yang secara dinamis menghasilkan kode mesin, menyiasati ini?
machine-code
jit
llvm
Siler
sumber
sumber
Jawaban:
Pada Linux dan banyak sistem Posix, sebuah aplikasi dapat mengubah perlindungan beberapa rentang ruang alamat proses dalam memori virtual menggunakan mmap (2) dan syscall mprotect (2) .
Jadi mesin JIT bisa menggunakan ini (mungkin sebelum emisi kode mesin, tapi mungkin setelah itu).
BTW, pada beberapa arsitektur, Anda mungkin perlu memberi tahu cache CPU tentang segmen kode mesin yang baru tersedia, misalnya
__builtin_clear_cache
GCC.sumber