Mã máy JIT và bit Thực thi Tắt


10

Làm thế nào là mã máy được tạo thời gian chạy (chẳng hạn như đầu ra của JIT), thực sự được CPU thực thi nếu CPU / HĐH có bit Tắt thực thi?

Theo như tôi biết, nhiều bộ vi xử lý hiện đại và hệ điều hành bao gồm hỗ trợ cho một NX cắn, (bao gồm cả Intel và ARM), trong đó ngăn chặn máy mã được bảo quản ở bất kỳ địa chỉ khác so với phần mã của một nhị phân tổng hợp từ được thực thi. Rõ ràng, đây là một lợi thế bảo mật tốt, bởi vì nó ngăn chặn các cuộc tấn công tiêm mã shell.

Nhưng làm thế nào để các công cụ JIT, như LLVM, tự động tạo mã máy, giải quyết vấn đề này?


Hãy xem các triển khai của Memory :: allocateMappedMemory để xem cách nó được thực hiện trong LLVM. - Dành cho * nix - Dành cho Windows
zr01

Câu trả lời:


6

Trên Linux và nhiều hệ thống Posix, một ứng dụng có thể thay đổi sự bảo vệ của một số phạm vi không gian địa chỉ quy trình trong bộ nhớ ảo bằng cách sử dụng các tòa nhà mmap (2)mprotect (2) .

Vì vậy, công cụ JIT có thể sử dụng những thứ này (có thể là trước khi phát ra mã máy, nhưng có lẽ sau nó).

BTW, trên một số kiến trúc, bạn có thể cần thông báo cho bộ đệm CPU về các phân đoạn mã máy mới có sẵn, ví dụ như __builtin_clear_cacheGCC.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.