Загрузчик (вычислительный)
Эта статья нуждается в дополнительных цитатах для проверки . ( июнь 2008 г. ) |
В компьютерных системах загрузчик , отвечающая — часть операционной системы за загрузку программ и библиотек . Это один из важных этапов процесса запуска программы, поскольку он помещает программы в память и подготавливает их к выполнению. Загрузка программы включает в себя либо отображение памяти , либо копирование содержимого исполняемого файла , содержащего инструкции программы, в память, а затем выполнение других необходимых подготовительных задач для подготовки исполняемого файла к запуску. После завершения загрузки операционная система запускает программу, передавая управление загруженному программному коду.
Все операционные системы, поддерживающие загрузку программ, имеют загрузчики, за исключением узкоспециализированных компьютерных систем, которые имеют только фиксированный набор специализированных программ. Встроенные системы обычно не имеют загрузчиков, вместо этого код выполняется непосредственно из ПЗУ или чего-то подобного. Для загрузки самой операционной системы в рамках загрузки специализированный загрузчик используется . Во многих операционных системах загрузчик постоянно находится в памяти, хотя некоторые операционные системы, поддерживающие виртуальную память , могут позволять загрузчику располагаться в области памяти, доступной для страниц .
В случае операционных систем, поддерживающих виртуальную память, загрузчик может фактически не копировать содержимое исполняемых файлов в память, а может просто объявить подсистеме виртуальной памяти, что существует сопоставление между областью памяти, выделенной для содержания выполняемых операций. код программы и содержимое соответствующего исполняемого файла. (См. файл, отображаемый в памяти .) Затем подсистема виртуальной памяти информируется о том, что страницы с этой областью памяти должны быть заполнены по требованию, если и когда выполнение программы действительно попадает в эти области незаполненной памяти. Это может означать, что части программного кода фактически не копируются в память до тех пор, пока они не будут фактически использованы, а неиспользуемый код вообще никогда не будет загружен в память.
Обязанности [ править ]
В Unix загрузчик является обработчиком системного вызова. execve()
. [1] В задачи загрузчика Unix входят:
- проверка (разрешения, требования к памяти и т. д.);
- отображение памяти исполняемого объекта с диска в основную память ;
- копирование аргументов командной строки в виртуальную память;
- инициализация регистров (например, указателя стека);
- переход к точке входа в программу (
_start
).
В Microsoft Windows 7 и более поздних версиях загрузчиком является LdrInitializeThunk
функция, содержащаяся в ntdll.dll , которая делает следующее:
- инициализация структур в самой DLL (т.е. критических секций , списков модулей);
- проверка исполняемого файла для загрузки;
- создание кучи (через функцию
RtlCreateHeap
); - выделение блока переменных среды и блока PATH;
- добавление исполняемого файла и NTDLL в список модулей ( двусвязный список );
- загрузка KERNEL32.DLL для получения нескольких важных функций, например
BaseThreadInitThunk
; - загрузка импорта исполняемого файла (т.е. динамической библиотеки ) рекурсивно (проверьте импорт импорта, его импорт и т.д.);
- в режиме отладки подъем точки останова системы;
- инициализация DLL;
- сбор мусора;
- звоню
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) с уже загруженными запущенными программами.
Если такие общие библиотеки могут совместно использоваться несколькими процессами, причем только одна копия общего кода может появляться по другому (виртуальному) адресу в адресном пространстве каждого процесса, код в общей библиотеке должен быть перемещаемым, т. е. библиотека должны использовать только внутренние адреса относительно себя или сегмента кода. Некоторые процессоры имеют инструкции, которые могут использовать для облегчения этого относительные ссылки на код.
См. также [ править ]
- Скомпилируйте и запустите систему
- DLL ад
- Прямая привязка
- Динамическое связывание (вычисления)
- Динамическое устранение мертвого кода
- Динамическая отправка
- Динамическая библиотека
- Динамический компоновщик
- Динамическая загрузка
- Динамическая библиотека
- Компоновщик GNU
- Библиотека (вычисления)
- Линкер (вычисления)
- Украшение имени
- Предварительное связывание
- Предварительное связывание
- Переезд (информатика)
- Таблица перемещения
- Шебанг (Unix)
- Статическая библиотека
- золото (линкер)
- предварительная ссылка
- Ошибка совместимости
Ссылки [ править ]
- ^ "исполнительный" . Базовые спецификации открытой группы, выпуск 6, IEEE Std 1003.1, издание 2004 г. Открытая группа . Проверено 23 июня 2008 г.
- ^ Корпорация IBM (1972). IBM OS MVT Supervisor (PDF) .
- ^ Корпорация IBM (1972). Редактор и загрузчик IBM OS Linkage (PDF) .