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