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

редактировать

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

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

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

Содержание
  • 1 Обязанности
  • 2 Перемещение загрузчиков
    • 2.1 OS / 360 и производные
  • 3 Динамические компоновщики
  • 4 См. Также
  • 5 Ссылки
Обязанности

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

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

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

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

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

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

В OS / 360 и дочерних системах функция (привилегированной) операционной системы называется IEWFETCH и является внутренним компонентом супервизора ОС, тогда как (не -privileged) Приложение LOADER может выполнять многие из тех же функций, а также функции редактора связей, и является полностью внешним по отношению к 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 ) в уже загруженные запущенные программы.

См. Также
  • значок Портал компьютерного программирования
Ссылки
Последняя правка сделана 2021-05-28 04:58:16
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте