XIP

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

XIP (англ. execute-in-placeвыполнение на месте) — технология, обеспечивающая возможность исполнения программного кода непосредственно с постоянного запоминающего устройства, на котором он находится, без предварительной загрузки в оперативную память. Широко применяется для первоначальной загрузки компьютеров, во встраиваемых системах в связи необходимостью экономить ресурсы оперативной памяти, в ряде случаев используется и для крупных систем. С 2010-х годов для применения в серверных Linux-системах с байтоадресуемой энергонезависимой памятью заменяется на более общую технологию — DAX.

Для функционирования технологии её поддержка должна быть реализована на трёх уровнях: хранения, в операционной системе, и самих исполняемых программах.

Устройства хранения

[править | править код]

Впервые в явном виде поддержка технологии на стороне устройств хранения, а также её аббревиатура и расшифровка, описаны в спецификации PCMCIA 1990 года, и в большей степени нацелена на применение с неперезаписываемыми устройствами[1]. Изначально технология ассоциировалась только с PCMCIA и её особой спецификацией, в которой определялись правила размещения бинарного кода и порядок его чтения и выполнения[2], но по мере реализации подобной техники для других интерфейсов и накопителей, укрепилось для всех устройств хранения.

Для работы режима XIP на накопителе, на котором расположена программа, должен быть реализован интерфейс, сходный с тем, по которому центральный процессор обращается к оперативной памяти. Для этого поддержка реализуется либо на уровне промежуточного программного обеспечения, либо средствами файловой системы. Среди промежуточных средств, обеспечивающих работу в режиме XIP — подсистема MTD (англ. Memory Technology Device), соответственно, файловые системы, работающие над MTD мимо блочного уровня, должны поддерживать соответствующие вызовы для работы XIP. При этом не все работающие через MTD файловые системы поддерживают XIP, поскольку многие из них, изначально ориентированные на портативную технику, реализовывали сжатие, в связи с этим реализация XIP в них нетривиальна, к числу таких файловых систем относятся JFFS2, YAFFS2, LogFS, UBIFS[3]. Тем не менее, существуют работающие над MTD сжимающие файловые системы с поддержкой XIP, такова, например, AXFS[англ.], функционирование режима XIP в которой подчёркивается как определяющая особенность (англ. advanced XIP filesystem)[3]. Основные сжимающие файловые системы блочного уровня для постоянных запоминающих устройств — cramfs и squashfs — не поддерживают XIP, но для cramfs существует патч, обеспечивающий поддержку XIP без сжатия, и большинство мобильных телефонов с системой на базе Linux использовали этот вариант cramfs[3].

Среди файловых систем общего назначения, работающих поверх блочного уровня, поддержка реализована в Ext2 и Ext3; в Ext4 был начат перенос поддержки XIP, но в 2014 году она заменена более общими методами прямого доступа — DAX[4].

Операционные системы

[править | править код]

Несмотря на то, что технология применялась во встраиваемых системах, в микропрограммном обеспечении и ряде операционных систем реального времени задолго до 2000-х годов[5], на стороне операционных систем общего назначения поддержка впервые реализована в ядре Linux версии 2.6 в 2005 году[6].

В 2006 году технология поддержана для мейнфреймов IBM zSeries, где имелась необходимость запускать множество различных экземпляров z/Linux[англ.] из среды z/VM с общим ядром и общими разделяемыми библиотеками, но с различными областями данных[7]. Если подобная возможность для z/OS существовала и ранее, то непосредственная реализация её для Linux потребовала бы существенных изменений в коде ядра операционной системы, поэтому в ветку ядра для архитектуры s390 перенесена поддержка XIP, а также поддержан ряд дополнительных возможностей, в том числе, поддержка на стороне Ext2[8]. Более того, считается, что именно потребность IBM в поддержке технологии для мейнфреймов и была движущей силой реализации XIP в Linux[9].

В 2010 году технология поддержана в NetBSD[5], где реализация оказалась относительно простой за счёт особенностей подсистемы управления виртуальной памяти и буферного кэша, притом прозрачной для файловых систем (то есть, не требующей специальной поддержки с их стороны).

Компиляция

[править | править код]

Для того, чтобы программа могла работать в режиме XIP требуется на этапе компиляции сообщить о возможности разделения областей для сегментов данных[англ.] и сегмента кода[англ.] (поскольку сегмент данных должен быть создан в оперативной памяти, а сегмент кода остаться в файловой системе). В GCC для этого используются опция -msep-data, и, кроме того, для XIP-программ обычно требуется опция -mid-shared-library, предписывающая сгенерировать код, допускающий вызов библиотек по идентификатору[10]. Установка любой из этих опций влечёт поднятие флага -fPIC — позиционно-независимой компиляции.

Основное предназначение технологии — экономия оперативной памяти устройства. Наиболее значительный эффект экономии оперативной памяти достигается при необходимости запуска нескольких экземпляров программы, в этом случае одно и то же пространство на постоянном запоминающем устройстве используется для обслуживания всех запусков, вместо того, чтобы выделять для каждого экземпляра область в оперативной памяти. Ещё одним эффектом оказывается снижение энергопотребления устройства за счёт уменьшения числа обращений к энергозависимой оперативной памяти[11].

Другой часто используемый эффект — быстрая начальная загрузка из постоянного запоминающего устройства, в частности, для достаточно большого по размеру монолитного ядра Linux, которое в традиционных способах должно быть изначально скопировано в оперативную память, в XIP может исполняться напрямую с накопителя.

При использовании флеш-накопителей наибольший эффект от XIP достигается с устройствами с байтовой адресацией, таких как NOR-флеш[5] (тогда как NAND-флеш, как и жёсткие диски, адресуются блочно, и доступ к отдельной инструкции означает чтение как правило 4 Кбайт, как минимум — 512 байтов). Этим же объясняется применение NOR-флеша для загрузочных постоянных запоминающих устройств и во встраиваемых системах, несмотря на его более высокую стоимость и более низкую плотность записи (в условиях 2010-х годов).

Ещё один эффект — возможность использования устройств постоянного хранения в качестве разделяемой памяти для выполняемых программ без задействования ресурсов основной памяти узла и разделением сегментов программы и данных, как реализовано в мейнфреймах.

В 2014 году на базе кода XIP в ядре Linux (с версии 3.14) реализована более общая технология — DAX (англ. direct access), объединяющая как возможности XIP, так и обеспечивающая необходимые вызовы для прямого доступа к данным, минуя страничный кэш[англ.][9]. Из файловых систем впервые технология реализована для Ext4, впоследствии появилась поддержка для XFS.

Основным мотивом для такого обобщения стало появление в середине 2010-х годов ёмких байтоадресуемых энергонезависимых устройств NVDIMM[англ.] и 3D XPoint для серверных систем, в связи с чем проявилась актуальность как запуска программного кода без переноса в основную память, так и прямого доступа к данным без промежуточного копирования в оперативную память. В файловых системах, ориентированных на такого рода устройства, таких как NOVA, PMFS, SCMFS, Aerie[12], поддержка DAX реализуется изначально и эта возможность считается одной из ключевых их особенностей.

Примечания

[править | править код]
  1. Mark Brownstein. PCMCIA Endorses PC Card Spec (англ.) // InfoWorld. — 1990. — Vol. 12, no. 36.
  2. Winn Rosh. PCMCIA: The Expansion System of Future (англ.) // PC Mag. — 1993. — Vol. 12, no. 2. — P. 321—326. «XIP is PCMCIA’s own specification, that allows program code in read-only memory to execute without being first loaded into main system … XIP standard defines how programs encoded on ROM cars are to read and execueted»
  3. 1 2 3 Халберт, 2008.
  4. Jonathan Corbet. Supporting filesystems in persistent memory. LWN.net (2 сентября 2014). Дата обращения: 26 мая 2018. Архивировано из оригинала 21 декабря 2018 года.
  5. 1 2 3 Уэбаяси, 2010.
  6. Корбет, 2005.
  7. How to use Execute-in-Place Technology with Linux on z/VM (англ.). SC34-2594-01. IBM (1 марта 2010). Дата обращения: 26 мая 2018. Архивировано 20 января 2022 года.
  8. Execute-in-place for file mappings. Linux documentation. Filesystems (13 ноября 2008). Дата обращения: 26 мая 2018. Архивировано 15 апреля 2022 года.
  9. 1 2 Jake Edge. Persistent memory (англ.). LWN.net (26 марта 2014). Дата обращения: 26 мая 2018. Архивировано 27 мая 2018 года.
  10. Richard Stallman. Using the GNU Compiler Collection. For GCC version 4.1.2. — Boston: GNU Press, 2005. — С. 153. — 470 с.
  11. Бенавидес и др., 2008.
  12. Jian Xu, Steven Swanson. NOVA: A Log-structured File System for Hybrid Volatile/Non-volatile Main Memories (англ.) // Proceedigns of 14th USENIX Conference on File and Storage Technologies (FAST ’16). — Santa Clara, CA: USENIX, 2016. — P. 323—328. — ISBN 978-1-931971-28-7.

Литература

[править | править код]
  • Tony Benavides, Justin Treon, Jared Hulbert, Weide Chang. The Enabling of an Execute-In-Place Architecture to Reduce the Embedded System Memory Footprint and Boot Time (англ.) // Journal of Computers. — 2008. — Vol. 3, no. 1. — P. 79—89.
  • Jared Hulbert. Introducing the Advanced XIP File System (англ.) // Proceedings of the Linux Symposium. — 2008. — Vol. 1. — P. 211—218.
  • Masao Uebayashi. eXecute-In-Place (XIP) Support for NetBSD // Proceedings of BSD Canada (BSDCan’2010). — 2010.