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 может выполнять многие из тех же функций, а также те же, что и редактор связей, и является полностью внешним по отношению к 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. ^ "исполнительный". Базовые спецификации открытой группы, выпуск 6, IEEE Std 1003.1, издание 2004 г. Открытая группа . Проверено 23 июня 2008 г.
  2. ^ Корпорация IBM (1972). IBM OS MVT Supervisor (PDF) .
  3. ^ Корпорация IBM (1972). Редактор и загрузчик IBM OS Linkage (PDF) .