Недавно я читал о том, как современные ОС загружают исполняемые программы и выделяют для них память. К сожалению, у меня есть только книга по информатике на русском языке в качестве справочника, поэтому, пожалуйста, поправьте меня, если я ошибаюсь, но, похоже, современные ОС имеют разные разделы в исполняемой программе для данных и реальных команд процессора. Кроме того, нельзя отдать управление разделу данных, т.е. нельзя хранить там команду. Также невозможно изменить команду процессора в исполняемой (text
) секции.
Отсюда вопрос: как это делает современный скомпилированный CL (SBCL, Clozure-CL)? Насколько я понимаю, он создает скомпилированные файлы FASL, а затем загружает их. Но видимые файлы FASL создаются при компиляции файла. Что происходит, когда вычисляется форма функции? Во-вторых, как CL загружает их (на уровне команд машины/ОС), чтобы для них была выделена правильная память? Кроме того, старый код должен быть каким-то образом разгружен.
PS. Конечно, это не проблема для интерпретируемых языков. А вот с JIT-компиляторами дело обстоит еще сложнее.
mprotect
для этого. - person Dan Robertson   schedule 28.06.2018