Загрузчик (вычисления) - Википедия - Loader (computing)

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

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

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

Обязанности

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Динамические компоновщики

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

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

Рекомендации

  1. ^ "exec". Базовые спецификации Open Group, выпуск 6, IEEE Std 1003.1, издание 2004 г.. Открытая группа. Получено 2008-06-23.
  2. ^ Корпорация IBM (1972 г.). IBM OS MVT Supervisor (PDF).
  3. ^ Корпорация IBM (1972 г.). Редактор и загрузчик связей с ОС IBM (PDF).