Как JVM может запускать сгенерированный машинный код из приложения Java через JIT? - PullRequest
0 голосов
/ 16 марта 2011

Как это возможно, что JVM динамически компилирует байт-код в собственный код, а затем выполняет его? Я могу себе представить, что можно записывать значения данных в память, но если я правильно помню, программа не может записать в память, которая содержит инструкции (в противном случае вирусы могут использовать эту функцию и быстро размножаться).

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

Как правило, вы не можете записать в раздел памяти, который содержит код напрямую, но есть способы переопределить это.Что касается JIT, то часто нужно иметь некоторое пространство для чтения и записи в куче, а затем использовать операцию, такую ​​как mprotect, чтобы сделать ее исполняемой.

4 голосов
/ 16 марта 2011

Очень немногие архитектуры реализуют уровень защиты памяти (только у ОС есть доступ на запись в области памяти, содержащие код), о которых вы говорите, в тех, где Java использует JIT, определенно нет.Вирусы используют эту функцию и даже больше для быстрого распространения.Но когда вы думаете об этом, нет ничего изначально опасного в процессе, изменяющем его собственный код.Это не более опасно, чем возможность записи в файл и загрузки библиотеки.

3 голосов
/ 16 марта 2011

ОС предоставляют средства для выделения «исполняемой» памяти.JVM должна выделять целевую память иначе, чем стандартная malloc () при генерации кода JIT.

Например, в Windows используйте VirtualAlloc с PAGE_EXECUTE ,Подобные функции существуют в Linux, AIX и т. Д. ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...