Динамическая загрузка времени исполнения
Переносимая загрузка — обычное, широко распространенное явление с очевидными преимуществами перед абсолютной загрузкой. Однако в многозадачной среде (даже в не зависящей от виртуальной памяти) схема переносимой загрузки становится неадекватной. Мы уже говорили о необходимости выгрузки и загрузки процессов в основную память для максимального использования процессора. Для максимального использования основной памяти нам нужна возможность загрузки процесса, после того как он был выгружен, всякий раз в другое место в памяти. Следовательно, будучи однажды загруженной, программа может быть сброшена на диск, а затем загружена в другое место в памяти. Это невозможно, если обращения к памяти в момент начальной загрузки привязаны к абсолютным адресам.
Альтернативное решение состоит в том, чтобы отложить вычисление абсолютного адреса до того момента, пока он не потребуется реально во время исполнения. С этой целью модуль загружается в основную память со ссылками в относительном виде (рис. 7.15,в), и только при реальном выполнении команды вычисляется абсолютный адрес. Для того чтобы такой метод не снижал общую производительность, требуется аппаратная поддержка вычисления абсолютного адреса (о чем говорилось в разделе 7.2),
Динамическое вычисление адресов обеспечивает высокую гибкость — программа может быть загружена в любую область основной памяти, причем программа может быть выгружена из основной памяти, а позднее — загружена в другое место в памяти.
Компоновка
Компоновщик получает в качестве входа набор объектных модулей и генерирует на их основе загружаемый модуль объединением множества модулей кодов и данных для последующей передачи его загрузчику. В каждом объектном модуле могут иметься ссылки на память в других модулях. Каждая такая ссылка в не скомпонованном модуле может быть выражена только символьно. Компоновщик создает единый загружаемый модуль, который объединяет все отдельные объектные модули. Каждая ссылка из одного модуля в другой должна быть разрешена и транслирована из символьного адреса в ссылку на ячейку памяти общего загружаемого модуля. Например, модуль А на рис. 7.16,а содержит вызов процедуры из модуля В. Когда эти модули комбинируются в единый загрузочный модуль, символьная ссылка на модуль В заменяется конкретной ссылкой на адрес точки входа В в загрузочном модуле.
Редактор связей
Природакомпоновки адресов зависит от типа создаваемого модуля и времени компоновки (см. табл. 7.2,6). Если требуется создание перемещаемого модуля, то компоновка обычно выполняется следующим образом. Каждый скомпилированный объектный модуль создается со ссылками относительно начала объектного модуля. Все эти модули объединяются в единый перемещаемый загружаемый модуль, в котором все ссылки даны относительно начала единого модуля. Такой модуль можно использовать для переносимой загрузки или динамической загрузки времени исполнения.
Компоновщик, который создает перемещаемый загрузочный модуль, часто называется редактором связей (на рис. 7.16 проиллюстрирована его работа).
Дата добавления: 2016-06-05; просмотров: 1223;