Выделите исполняемый поршень в c на Linux

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

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

11
задан pklall 26 June 2010 в 22:47
поделиться

2 ответа

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

15
ответ дан 3 December 2019 в 05:33
поделиться

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

6
ответ дан 3 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: