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