Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции кошкин.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
667.65 Кб
Скачать
  1. Перемещающий загрузчик.

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

Второй подход, использование разряда перемещения. С каждым словом объектного кода связан разряд перемещения 1 или 0. Для каждой потенциальной команды один разряд. Эти разряды объединяют и записывают после указателя длины каждой записи фрагмента программы. Если разряд перемещения установлен в 1, то при перемещении начальный адрес увеличивается на величину соответствующую этому разряду. Если разряд 0, то перемещений, преобразований делать не надо. Такие преобразуемые программы, объем памяти программы с этими разрядами увеличивается, но не намного. В некоторых вычислителях используют аппаратные средства для перемещения программы. Процедура перемещения замыкается на связывании программ – после первого файла необходимо автоматически перейти к выполнению следующей. Т.е. сформировать ее начальный адрес. Но первоначально фрагменты программы загружаются как самостоятельные и загрузчик рассматривает их как отдельные не связанные составляющие. Входная информация для связывающего загрузчика состоит из набора объектных программ, которые д.б. объединены в единое. При использовании в секциях внешних ссылок на имена, значения которых во входном потоке не были определены, процедура связывания не начнется до тех про, пока не будут назначены адреса для всех требуемых имен. Отсюда связывающие загрузчики используют два просмотра: во время первого- назначение адреса всех внешних ссылок, во время второго – непосредственно загрузка, перемещение и связывание.

Основная структура данных необходимая для связывающего загрузчика – это таблица внешних имен. Она используется для хранения имен и адресов всех внешних ссылок для всего набора внешних программ. Часто таблица хранит информацию какая секция содержит определения имени. Во время первого просмотра загрузчик обрабатывает заголовок и записи управления секций. Начальный адрес, формируемой программы, берется из ОС. Этот адрес встает в начало программы и ему присваивается текущее значение. Поскольку ссылки находятся в таблице внешних имен, то эти переменные так же получают адреса, за счет сложения начального адреса с адресами определений из программ. Длина программы формируется на первом просмотре после прочтения конца. Это сказано для размещения первой подпрограммы. Следующие за ней подпрограммы размещаются дальше также, путем сложения последнего адреса с переменной из таблицы и т.д. После первого просмотра в таблице имен содержаться все внешние имена и назначенные им адреса. Т.е. содержимое таблицы изменилось, в них поменялись адреса ссылок. Часто загрузчики после второго просмотра могут выдавать данные на печать. Во время второго просмотра осуществляется непосредственно связывание, перемещения программы. Начальный адрес всегда соответствует физической величине. Внутренние ссылки модифицируются по мере анализа. Часто после завершения загрузки управление передается на загруженную программу. Встречаются загрузчики, в которых последний адрес возвращает управление ОС. Тогда пользователь сам запускает программу. Если при передачи управления адрес задан более чем в одной секции в одной программе, используют последний адрес выхода из загрузчика, остальные игнорируются. Иногда применяют ссылочный номер – каждой внешней ссылке присваивается свой номер. Эти номера применяются вместо записи в модификатор. При просмотре одних и тех же имен нет необходимости обращаться каждый раз к таблице внешних имен, достаточно одного раза.

Использование библиотек. В связывающих загрузчиках часто применяют автоматическое включение библиотечных программ. Т.е. для этого необходима некая стандартная библиотека. Если ее нет, используют специальные директивы. Применение библиотек – экономия трудозатрат, процедура аналогичная языку высокого уровня. Библиотеки загружаются в такой же последовательности, как и подпрограммы, с применением внешних имен. Библиотечный поиск – небольшая программа аналогичная стандартным средствам вызова. Если в библиотеке не имеются внешние ссылки, то при первом просмотре они определяются загрузчиком и их имена (адреса) модифицируются. Второй просмотр будет только после определения всех ссылок. Обычно библиотеки содержат ассемблерные версии. В тоже время библиотека имеет файловую структуру: каталог и файлы, имена этих файлов их адреса. И модифицируются как внешние ссылки. Наличие библиотек позволяет ускорить процесс поиска требуемых подпрограмм и быстрее обработать внешние ссылки.