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

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

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

Ответ 1

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

Ответ 2

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