Как динамически генерировать и запускать машинный код?

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

Моя (очень "новенькая") реакция коленного рефлекса , поскольку я не имею ни малейшего понятия, с чего начать, было бы попробовать что-то вроде следующего:

  1. mmap () блок памяти, установка доступа к PROT_EXEC
  2. , запись собственного кода в блок
  3. сохранить текущие регистры (указатель стека и др.) в каком-нибудь месте. Cosy
  4. изменить текущие регистры, чтобы они указывали на блок собственного кода в отображенной области
  5. , собственный код теперь будет выполняться машиной
  6. восстановить предыдущие регистры

Это даже близко к / правильному алгоритму? Я' Я пробовал просматривать различные проекты, которые, как мне известно, имеют JIT-компиляторы для изучения (например, V8 ), но эти кодовые базы оказались трудными для использования из-за их размера, и я не знаю, с чего начать.

32
задан Chris Tonkinson 6 February 2011 в 06:32
поделиться