Kode mesin JIT dan bit Eksekusi Nonaktifkan

10

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?

Siler
sumber
Lihatlah implementasi Memory :: mengalokasikanMappedMemory untuk melihat bagaimana hal itu dilakukan dalam LLVM. - Untuk * nix - Untuk Windows
zr01

Jawaban:

6

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_cacheGCC.

Basile Starynkevitch
sumber