В информатике выполнение на месте ( XIP ) — это метод выполнения программ непосредственно из долговременного хранилища, а не копирования их в оперативную память . Это расширение использования общей памяти для уменьшения общего объема необходимой памяти.
Его общий эффект заключается в том, что текст программы не использует доступную для записи память, сохраняя ее для динамических данных, и что все экземпляры программы запускаются из одной копии.
Чтобы это работало, необходимо соблюдение нескольких критериев:
Требования к хранению обычно удовлетворяются за счет использования флэш-памяти NOR или EEPROM , которая может иметь побайтовую адресацию для операций чтения, хотя в большинстве конфигураций она немного медленнее, чем обычное системное ОЗУ.
Обычно загрузчик первого этапа представляет собой программу XIP, которая запускается по адресу, по которому отображаются флэш-чипы при включении питания, и содержит минимальную программу для настройки системной оперативной памяти (которая зависит от компонентов). используется на отдельных платах и не может быть достаточно обобщен, чтобы правильная последовательность могла быть встроена в аппаратное обеспечение процессора), а затем загружает загрузчик второго этапа или ядро ОС в ОЗУ.
Во время этой инициализации доступная для записи память может быть недоступна, поэтому все вычисления должны выполняться в регистрах процессора. По этой причине загрузчики первого этапа, как правило, пишутся на языке ассемблера и делают лишь минимум, обеспечивающий нормальную среду выполнения для следующей программы. Некоторые процессоры либо встраивают небольшой объем SRAM в сам чип [1] , либо позволяют использовать встроенную кэш-память в качестве ОЗУ [2] , чтобы упростить запись загрузчика первого этапа с использованием языка высокого уровня.
Для ядра или загрузчика адресное пространство обычно назначается внутри, поэтому, чтобы использовать для них XIP, достаточно дать указание компоновщику размещать немодифицируемые и модифицируемые данные в разных диапазонах адресов и предоставить механизм копирования модифицируемых данных. в доступную для записи память перед запуском любого кода, предполагающего, что к данным можно получить обычный доступ. Это можно сделать как часть предыдущего этапа или в небольшом сегменте кода в начале программы.
Если адресное пространство назначается извне, например, в прикладной программе, которая запускается в системе, которая не предоставляет виртуальную память , компилятору необходимо получить доступ ко всем изменяемым данным, добавив смещение к указателю на частную копию области данных. В этом случае внешний загрузчик отвечает за настройку областей памяти, специфичных для экземпляра.
BIOS и UEFI используют XIP для инициализации основной памяти .
XIP предъявляет к файловым системам требования, которые зачастую трудно удовлетворить. В системах без таблицы страниц весь файл должен храниться в последовательных байтах и не должен быть фрагментирован, в то время как файловые системы на основе флэш-памяти часто стремятся распределить данные по секторам флэш-чипа, которые имеют наименьшее количество циклов стирания и выравнивают износ . чипа, продлевая срок его службы.
Все эти сложности и компромисс в скорости означают, что XIP обычно используется только для загрузчиков первого этапа или когда оперативной памяти крайне не хватает. В частности, игровые консоли второго-четвертого поколений подключают адрес и шину данных ПЗУ-картриджа к шине данных консоли, [3] что позволяет (например) Atari 2600 работать только со 128 байтами ОЗУ в интерфейсе джойстика. IC .
Относительно новая файловая система для Linux, называемая AXFS ( Advanced XIP File System ), призвана преодолеть некоторые недостатки, связанные с XIP, особенно в отношении выполнения приложений пользовательского пространства на месте . Например, он позволяет разбить исполняемый двоичный файл на «регионы XIP», избежав тем самым ограничения фрагментации, упомянутого выше.
Реализация NetBSD также находится в стадии разработки. [4]