Перемещающий загрузчик - Большая Энциклопедия Нефти и Газа, статья, страница 1
Хорошо не просто там, где нас нет, а где нас никогда и не было! Законы Мерфи (еще...)

Перемещающий загрузчик

Cтраница 1


1 Программа с внешними ссылками и точками входа.| Программа с точками входа. [1]

Перемещающий загрузчик затем обрабатывает все объектные модули программы, формируя свою таблицу внешних символов и идентификаторов точек входа. Поскольку размеры объектных модулей известны, их можно оптимально разместить в памяти.  [2]

Использовать перемещающий загрузчик, который принимает от ассемблера специально подготовленные перемещаемые двоичные коды.  [3]

Если перемещающий загрузчик используется до редактора связей или для размещения модуля, содержащего небольшое число связанных модулей, процедурам в этих модулях назначаются абсолютные адреса ячеек ПАМЯТИ. Вызовы в этих модулях соединяются затем с соответствующими процедурами во время последующего шага редактирования связей. При использовании таким способом шаги редактирования связей и перемещения должны чередоваться столько, сколько необходимо для полного редактирования всех связей программы и правильного размещения в ПАМЯТИ.  [4]

Перемещающие ассемблеры и перемещающие загрузчики устраняют эти проблемы посредством определения адресов загрузки во время процесса загрузки модулей. Для выполнения этой процедуры перемещающие ассемблеры и загрузчики различают абсолютные и перемещаемые величины: значение абсолютной величины ( идентификатора или выражения) не зависит от адреса, по которому производится загрузка программы; значение перемещаемой величины ( идентификатора или выражения) находится в зависимости от адреса, по которому производится загрузка программы.  [5]

Сама настройка осуществляется с помощью специальных программ: перемещающих загрузчиков или редакторов.  [6]

Но эта ячейка памяти была назначена относительно нулевой ячейки памяти, которая рассматривается компилятором как содержащая первую команду процедуры. Когда перемещающим загрузчиком процедуре назначается конкретный адрес загрузки, к адресной части команды прибавляется значение константы перемещения, обеспечивая тем самым правильное выполнение команды перехода. Например, если ИСПОЛНИТЕЛЬНАЯ процедура перемещается в памяти таким образом, что ее первая команда помещается в ячейке памяти 1000Н, то адресная часть команды безусловного перехода настраивается перемещающим загрузчиком относительно этой ячейки памяти. Таким образом, выполняемой командой будет команда JMP 1003H, или СЗ 03 10, как это требуется для правильной работы системы. Заметим, что в листинге ассемблера отсутствует информация для редактирования связей перемещения и отладки, что адресные байты в машинных командах хранятся в обратном порядке ( 03 10 вместо 10 03) и что добавление символа Н к числу означает шестнадцатеричную интерпретацию этого числа. В примере на рис. 7.6 все команды вызова имеют один и тот же нулевой адрес. Когда каждому модулю отводится конкретный участок памяти и процедуры связываются вместе, адресная часть каждой команды CALL заменяется действительным адресом соответствующей процедуры. Для того чтобы эти адреса заменялись правильно, информация для связей, перемещения и отладки содержит символические имена каждой вызываемой процедуры. Предусматривается также информация, указывающая, какие команды CALL соответствуют каждому из символических имен. Необходимо заметить, что адреса в командах CALL в листинге ассемблера не обязательно должны быть нулевыми, как показано в примере. Обсуждение вопроса, когда это случается, а также другие конкретные детали использования информации для связей, перемещения и отладки выходят за рамки нашего рассмотрения.  [7]

В Intel 8086 все модули связываются вместе одной операцией и затем связанные программы размещаются в ППЗУ за один шаг. Чтобы разместить модули по отдельным ППЗУ, перемещающий загрузчик предусматривает начальную ячейку памяти ППЗУ для каждого модуля или группы модулей. Следует заметить, что в этом случае модули векторов переходов должны быть переведены на язык ассемблера, поскольку PL / M микрокомпьютера Intel 8086 не позволяет непосредственно реализовать организацию связей с помощью вектора переходов.  [8]

Повторное ассемблирование чаще используется на малых машинах. Если позволяют ресурсы памяти, то предпочтительнее иметь перемещающий загрузчик. Программы, перемещающие себя, оказываются экономически нецелесообразными, поскольку требуют перестройки сотен или даже тысяч адресов.  [9]

Как мы уже видели, связывание представляет собой процесс соединения процедур через вызовы этих процедур, а перемещение - процесс назначения командам программы конкретных ячеек памяти. В общем случае редактирование связей может быть выполнено как до, так и после перемещения. Однако это в значительной степени зависит от самих программ - редакторов связей и перемещающих загрузчиков, поставляемых изготовителями и поставщиками. Мы предполагаем, что редактор связей и перемещающий загрузчик могут использоваться в любой последовательности.  [10]

Но эта ячейка памяти была назначена относительно нулевой ячейки памяти, которая рассматривается компилятором как содержащая первую команду процедуры. Когда перемещающим загрузчиком процедуре назначается конкретный адрес загрузки, к адресной части команды прибавляется значение константы перемещения, обеспечивая тем самым правильное выполнение команды перехода. Например, если ИСПОЛНИТЕЛЬНАЯ процедура перемещается в памяти таким образом, что ее первая команда помещается в ячейке памяти 1000Н, то адресная часть команды безусловного перехода настраивается перемещающим загрузчиком относительно этой ячейки памяти. Таким образом, выполняемой командой будет команда JMP 1003H, или СЗ 03 10, как это требуется для правильной работы системы. Заметим, что в листинге ассемблера отсутствует информация для редактирования связей перемещения и отладки, что адресные байты в машинных командах хранятся в обратном порядке ( 03 10 вместо 10 03) и что добавление символа Н к числу означает шестнадцатеричную интерпретацию этого числа. В примере на рис. 7.6 все команды вызова имеют один и тот же нулевой адрес. Когда каждому модулю отводится конкретный участок памяти и процедуры связываются вместе, адресная часть каждой команды CALL заменяется действительным адресом соответствующей процедуры. Для того чтобы эти адреса заменялись правильно, информация для связей, перемещения и отладки содержит символические имена каждой вызываемой процедуры. Предусматривается также информация, указывающая, какие команды CALL соответствуют каждому из символических имен. Необходимо заметить, что адреса в командах CALL в листинге ассемблера не обязательно должны быть нулевыми, как показано в примере. Обсуждение вопроса, когда это случается, а также другие конкретные детали использования информации для связей, перемещения и отладки выходят за рамки нашего рассмотрения.  [11]

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

Как мы уже видели, связывание представляет собой процесс соединения процедур через вызовы этих процедур, а перемещение - процесс назначения командам программы конкретных ячеек памяти. В общем случае редактирование связей может быть выполнено как до, так и после перемещения. Однако это в значительной степени зависит от самих программ - редакторов связей и перемещающих загрузчиков, поставляемых изготовителями и поставщиками. Мы предполагаем, что редактор связей и перемещающий загрузчик могут использоваться в любой последовательности.  [13]

Перемещаемым модулем называется такой модуль, который может быть размещен в любом месте ПАМЯТИ после того, как он оттранслирован. Во время трансляции предполагается, что первой ячейкой памяти, которая может быть занята командами машинного языка каждого модуля, является нулевая ячейка. Все остальные ячейки памяти, необходимые для модуля, назначаются так, как будто это предположение является правильным. Для того чтобы можно было восстановить команды обращения к памяти, во время трансляции создается информация для редактора связей, перемещающего загрузчика и отладки. Эта информация вместе с командами на машинном языке хранится в файле команд на машинном языке, или объектном файле. Позже, когда модули объединяются, или связываются вместе, и когда каждому модулю назначается специальная область в ПАМЯТИ ( когда модуль перемещается в ПАМЯТИ), адрес в каждой команде обращения к памяти настраивается с помощью вышеуказанной информации для редактора связей и перемещающего загрузчика. Независимо от порядка, в котором совершаются редактирование и перемещение, результат должен быть одним и тем же: каждая команда обращения к памяти должна содержать действительный адрес процедуры, структуры данных или команды.  [14]

Если программа, в которой редактируются связи, еще не размещена, редактор связей не может назначить абсолютные адреса памяти для вызовов или для команд обращения к памяти. Он назначает новые перемещаемые адреса и настраивает все адреса в процедурах вызова и командах обращения к памяти относительно нового начального адреса. При этом создается новый перемещаемый модуль на машинном языке из отдельных процедур и модулей, которые были связаны вместе. Связанные таким образом модули могут снова связываться вместе до тех пор, пока, наконец, все вызовы не будут привязаны к соответствующим процедурам. После этого перемещающий загрузчик назначает конкретные ячейки памяти каждой команде в связанном модуле и настраивает адреса каждой команды обращения к памяти, завершая при этом генерацию готового к выполнению модуля.  [15]



Страницы:      1    2