Выделите исполняемый ОЗУ в C на Linux - PullRequest
11 голосов
/ 27 июня 2010

Я хочу сделать простой и своевременный компилятор с c на Linux.

Как я могу выделить память так, чтобы я мог записать в нее сырой код x86 и выполнить ее как любую другую функцию?

Ответы [ 2 ]

15 голосов
/ 27 июня 2010

См. Mprotect (). После того как вы заполнили (n-) область памяти размером с страницу (выделенную с помощью mmap ()) с кодом, измените его разрешения, чтобы запретить запись и разрешить выполнение.

6 голосов
/ 27 июня 2010

Помимо правильного использования mprotect для предоставления разрешения на первую запись и последующее выполнение, при некоторых операциях с ОС / оборудованием вам может потребоваться очистка I-кэша . На данный момент (середина 2010 г.) все последние процессоры x86 имеют отдельные кэши уровня 1 для инструкций и данных, и кто-то должен убедиться, что если вы запишите новые инструкции в память (которая обновит D-кэш), вы Затем попробуйте выполнить устаревшие биты из I-кэша. Как именно очистить I-кеш от пространства пользователя, будет зависеть как от вашего оборудования, так и от операционной системы. Я бы посоветовал прочитать документацию Intel по "самоизменяющемуся коду" для своих мультипроцессоров IA-32. Этого должно быть достаточно, чтобы помочь вам.

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