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

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

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

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

Обязанности

В Unix , загрузчик является обработчиком для системного вызова execve() . В задачи загрузчика 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 , который запустит исполняемый файл)

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

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

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

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

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 после чтения будет изменен на TIC, и загрузка и перемещение продолжатся с использованием следующего буфера; в противном случае канал остановится на NOP CCW, пока он не будет перезапущен IEWFETCH через другой специальный выход IOS. Три буфера находятся в непрерывной кольцевой очереди, каждый указывает на свою следующую, а последний указывает на первый, и три буфера постоянно повторно используются по мере загрузки и перемещения.

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

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

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

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

использованная литература