Введение

Часть операционной системы, приложения, ускоряющие загрузку с магнитной ленты или диска. В компьютерных системах загрузчик – это часть операционной системы, отвечающая за загрузку программ и библиотек. Это один из важнейших этапов процесса запуска программы, поскольку он помещает программы в память и подготавливает их к исполнению. Загрузка программы включает в себя сопоставление памяти или копирование содержимого исполняемого файла, содержащего инструкции программы, в память, а затем выполнение других необходимых подготовительных задач для подготовки исполняемого файла к запуску. После завершения загрузки операционная система запускает программу, передавая управление загруженному коду программы. Все операционные системы, поддерживающие загрузку программ, имеют загрузчики, за исключением высокоспециализированных компьютерных систем, которые имеют только фиксированный набор специализированных программ. Встроенные системы обычно не имеют загрузчиков, и вместо этого код выполняется непосредственно из ПЗУ или аналогичного устройства. Для загрузки самой операционной системы в процессе загрузки используется специализированный загрузчик. Во многих операционных системах загрузчик постоянно находится в памяти, хотя некоторые операционные системы, поддерживающие виртуальную память, могут позволить загрузчику располагаться в области памяти, доступной для подкачки. В случае операционных систем, поддерживающих виртуальную память, загрузчик может не копировать содержимое исполняемых файлов в память, а может просто сообщить подсистеме виртуальной памяти о наличии сопоставления между областью памяти, выделенной для кода выполняемой программы, и содержимым соответствующего исполняемого файла. (См. файл, сопоставленный с памятью). Подсистема виртуальной памяти затем узнает, что страницы с этой областью памяти должны быть заполнены по требованию, если и когда выполнение программы фактически достигнет этих областей незаполненной памяти. Это может означать, что части кода программы на самом деле не копируются в память, пока они не будут использованы, а неиспользуемый код может никогда не загружаться в память вообще.

Перемещение погрузчиков

Некоторым операционным системам требуются релоцирующие загрузчики, которые корректируют адреса (указатели) в исполняемом файле для компенсации различий в адресе, с которого начинается загрузка. Операционные системы, которым нужны релоцирующие загрузчики, – это те, в которых программа не всегда загружается в одно и то же место в (виртуальном) адресном пространстве и в которых указатели являются абсолютными адресами, а не смещениями от базового адреса программы. Примеры известных систем включают OS/360 от IBM для мейнфреймов System/360 и её потомков, в том числе z/OS для мейнфреймов z/Architecture.

OS/360 и деривативы

В ОС/360 и последующих системах (привилегированная) функция операционной системы называется IEWFETCH и является внутренним компонентом ОС-супервайзера, в то время как (непривилегированная) программа LOADER может выполнять многие из тех же функций, плюс функции редактора связей, и полностью внешне по отношению к ОС-супервайзеру (хотя она, безусловно, использует многие службы супервайзера). IEWFETCH использует высокоспециализированные канальные программы, и теоретически возможно загрузить и переместить весь исполняемый файл в течение одного оборота носителя DASD (около 16,6 мс максимум, 8,3 мс в среднем, на "устаревших" 3600 оборотов в минуту дисках). Для модулей загрузки, которые превышают размер трека, также возможно загрузить и переместить весь модуль без потери оборота носителя. IEWFETCH также включает в себя средства для так называемых структур наложения, что облегчает запуск потенциально очень больших исполняемых файлов в минимальной модели памяти (в некоторых версиях ОС она составляет 44 КБ, но более распространены 88 КБ и 128 КБ). Ядро ОС (постоянно резидентная часть супервайзера) само по себе форматируется таким образом, чтобы быть совместимым с упрощенной версией IEWFETCH. В отличие от обычных исполняемых файлов, ядро ОС "разбросано" по памяти: части ядра загружаются в различные области памяти; в частности, некоторые системные таблицы должны располагаться ниже начальных 64 КБ, в то время как другие таблицы и код могут находиться в другом месте. Приложение Linkage Editor системы называется IEWL. Основная функция IEWL – объединять модули загрузки (исполняемые программы) и объектные модули (выходные данные, например, ассемблеров и компиляторов), включая "автоматические вызовы" в библиотеки (встроенные функции языков высокого уровня), в формат, который может быть наиболее эффективно загружен IEWFETCH. Существует большое количество опций редактирования, но для обычного приложения обычно используется лишь несколько из них. Формат модуля загрузки включает в себя начальную "текстовую запись", за которой немедленно следует "запись релокации и/или управления" для этой текстовой записи, за которой следуют дополнительные пары "текстовая запись – запись релокации и/или управления" до конца модуля. Текстовые записи обычно очень большие; записи релокации и/или управления небольшие, поскольку три буфера записей релокации и/или управления IEWFETCH фиксированы в размере 260 байт (меньшие записи релокации и/или управления, безусловно, возможны, но 260 байт – максимально возможный размер, и IEWL обеспечивает соблюдение этого ограничения, вставляя дополнительные записи релокации, при необходимости, перед следующей текстовой записью; в этом специальном случае последовательность записей может быть следующей: , текстовая запись, запись релокации, , контрольная запись, текстовая запись, ). Специальный байт в буфере релокации и/или управления используется в качестве области обмена данными "отключенного битового ожидания" и инициализируется уникальным значением. В CCW чтения для этой записи релокации и/или управления установлен бит "Прерывание по программе". Таким образом, процессор уведомляется о том, что канал получил доступ к CCW через специальный выход IOS. В этот момент процессор входит в цикл "отключенного битового ожидания" (иногда называемый "самым коротким циклом в мире"). Как только этот байт изменяется от своего начального значения, процессор выходит из битового ожидания, и происходит релокация во время "промежутка" между записью релокации и/или управления и следующей текстовой записью. Если релокация завершена до следующей записи, то NOP CCW, следующая за CCW чтения, будет изменена на TIC, и загрузка и релокация продолжатся с использованием следующего буфера; в противном случае канал остановится на NOP CCW, пока не будет перезапущен IEWFETCH через другой специальный выход IOS. Три буфера находятся в непрерывной циклической очереди, каждый из которых указывает на следующий, а последний – на первый, и три буфера постоянно используются повторно в процессе загрузки и релокации. Таким образом, IEWFETCH может загружать и релоцировать модуль загрузки любого практического размера в минимально возможное время.

Динамические стыковки

Динамические загрузчики связей – это другой тип загрузчика, который загружает и связывает общие библиотеки (например, файлы .so, .dll или .dylib) с уже запущенными программами. Поскольку такие общие библиотеки могут использоваться несколькими процессами, при этом только одна копия общего кода может находиться по разным (виртуальным) адресам в адресном пространстве каждого процесса, код в общей библиотеке должен быть перемещаемым, то есть библиотека должна использовать только относительные адреса, привязанные к самой себе или к базовому адресу сегмента кода. Некоторые процессоры имеют инструкции, которые могут использовать самоотносительные ссылки на код для облегчения этого.