stringtranslate.com

Загрузчик (вычислительный)

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

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

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

Обязанности

В Unix загрузчик является обработчиком системного вызова execve() . [1] Задачи загрузчика Unix включают в себя:

  1. проверка (разрешения, требования к памяти и т. д.);
  2. отображение исполняемого объекта с диска в основную память ;
  3. копирование аргументов командной строки в виртуальную память;
  4. инициализация регистров (например, указателя стека);
  5. переход к точке входа в программу ( _start).

В Microsoft Windows 7 и выше загрузчиком является LdrInitializeThunkфункция, содержащаяся в ntdll.dll , которая выполняет следующие действия:

  1. инициализация структур в самой DLL (т.е. критических секций , списков модулей);
  2. проверка исполняемого файла для загрузки;
  3. создание кучи (через функцию RtlCreateHeap);
  4. выделение блока переменных среды и блока PATH;
  5. добавление исполняемого файла и NTDLL в список модулей ( двунаправленный список );
  6. загрузка KERNEL32.DLL для получения нескольких важных функций, например BaseThreadInitThunk;
  7. загрузка импортов исполняемых файлов (т.е. динамически подключаемых библиотек ) рекурсивно (проверка импортов импортов, их импортов и т.д.);
  8. в режиме отладки — повышение системной точки останова;
  9. инициализация DLL;
  10. вывоз мусора;
  11. вызов NtContinueконтекстного параметра, заданного для функции загрузчика (т.е. переход к RtlUserThreadStart, который запустит исполняемый файл)

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

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

OS/360 и производные

В OS/360 и дочерних системах (привилегированное) средство операционной системы называется IEWFETCH [2] и является внутренним компонентом OS Supervisor, тогда как (непривилегированное) приложение LOADER может выполнять многие из тех же функций, а также функции Linkage Editor и является полностью внешним по отношению к OS Supervisor (хотя оно, безусловно, использует многие службы Supervisor).

IEWFETCH использует узкоспециализированные канальные программы , и теоретически возможно загрузить и переместить весь исполняемый файл в течение одного оборота носителя DASD (около 16,6 мс максимум, 8,3 мс в среднем, на «устаревших» дисках со скоростью вращения 3600 об/мин). Для загрузочных модулей, размер которых превышает размер дорожки, также возможно загрузить и переместить весь модуль без потери оборота носителя.

IEWFETCH также включает в себя средства для так называемых оверлейных структур, что облегчает запуск потенциально очень больших исполняемых файлов в минимальной модели памяти (всего 44 КБ в некоторых версиях ОС, но чаще встречаются 88 КБ и 128 КБ).

Ядро ОС (всегда резидентная часть Supervisor) само по себе отформатировано таким образом, чтобы быть совместимым с урезанной версией IEWFETCH. В отличие от обычных исполняемых файлов, ядро ​​ОС «загружается разрозненно»: части ядра загружаются в разные части памяти; в частности, некоторые системные таблицы должны располагаться ниже начальных 64 КБ, в то время как другие таблицы и код могут располагаться в другом месте.

Приложение Linkage Editor системы называется IEWL. [3] Основная функция IEWL — связывать загрузочные модули (исполняемые программы) и объектные модули (выходные данные, например, ассемблеров и компиляторов), включая «автоматические вызовы» библиотек (встроенные функции языка высокого уровня), в формат, который может быть наиболее эффективно загружен IEWFETCH. Существует большое количество опций редактирования, но для обычного приложения обычно используются лишь некоторые из них.

Формат загрузочного модуля включает в себя начальную «текстовую запись», за которой сразу же следует «запись перемещения и/или управления» для этой текстовой записи, за которой следуют дополнительные экземпляры пар текстовой записи и записи перемещения и/или управления, до конца модуля.

Текстовые записи обычно очень большие; записи перемещения и/или управления малы, поскольку три буфера записей перемещения и/или управления IEWFETCH зафиксированы на уровне 260 байт (меньшие записи перемещения и/или управления, безусловно, возможны, но 260 байт — это максимально возможный размер, и IEWL обеспечивает соблюдение этого ограничения, вставляя дополнительные записи перемещения по мере необходимости перед следующей текстовой записью, если это необходимо; в этом особом случае последовательность записей может быть следующей: ..., текстовая запись, запись перемещения, ..., контрольная запись, текстовая запись, ...).

Специальный байт в буфере записи перемещения и/или управления используется как область связи "отключенного вращения бита" и инициализируется уникальным значением. Чтение CCW для этой записи перемещения и/или управления имеет установленный бит прерывания, управляемого программой. Таким образом, процессор уведомляется, когда этот CCW был доступен каналу через специальный выход IOS . В этот момент процессор входит в цикл "отключенного вращения бита" (иногда называемый "самым коротким циклом в мире"). Как только этот байт изменяется от своего инициализированного значения, ЦП выходит из вращения бита, и перемещение происходит во время "пробела" в носителе между записью перемещения и/или управления и следующей текстовой записью. Если перемещение завершается до следующей записи, NOP CCW, следующий за чтением, будет изменен на TIC, и загрузка и перемещение продолжатся с использованием следующего буфера; если нет, то канал остановится на NOP CCW, пока он не будет перезапущен IEWFETCH через другой специальный выход IOS. Три буфера находятся в непрерывной круговой очереди, каждый из которых указывает на следующий, а последний указывает на первый, и три буфера постоянно повторно используются по мере загрузки и перемещения.

Таким образом, IEWFETCH может загружать и перемещать загрузочный модуль любого практического размера за минимально возможное время.

Динамические линкеры

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

Если такие общие библиотеки могут совместно использоваться несколькими процессами, и только одна копия общего кода может появляться по другому (виртуальному) адресу в адресном пространстве каждого процесса, код в общей библиотеке должен быть перемещаемым, т. е. библиотека должна использовать только внутренние адреса, относительные к базе сегмента кода. Некоторые процессоры имеют инструкции, которые могут использовать относительные к базе ссылки на код, чтобы облегчить это.

Смотрите также

Ссылки

  1. ^ "exec". The Open Group Base Specifications Issue 6, IEEE Std 1003.1, издание 2004 г. The Open Group . Получено 23.06.2008 .
  2. ^ Корпорация IBM (1972). IBM OS MVT Supervisor (PDF) .
  3. ^ IBM Corporation (1972). Редактор и загрузчик IBM OS Linkage (PDF) .