Относительная загрузка

Относительная загрузка состоит в том, что мы грузим программу каждый раз с нового адреса. При этом мы должны настроить ее на новые адреса.

Как известно, программа представляет собой последовательность команд. Каждая команда состоит из кода операции и одного или нескольких адресных полей. В процессорах, разработанных в 70-е гг. и в начале 80-х, у команды может быть переменное количество таких полей, от нуля до 5-6, а то и больше. У RISC-процессоров количество полей уменьшилось, тем не менее, остается переменным. Каким же образом вычисляется адрес этого поля.

Существуют три способа вычисления адреса в команде.

Первый способ очень прост - берется адресное поле, возможно, расширенное со знаком или нулями, и говорится, что это и будет наш виртуальный адрес. Это называется абсолютной адресацией. Очевидно, что если мы захотим ``сдвинуть'' программу по адресам виртуальной памяти так, чтобы она начиналась, скажем, не с адреса 01000, а с адреса 02000, то мы должны будем найти все команды с абсолютными адресными полями и прибавить ко всем этим полям разность нового и старого адресов.

Второй способ адресации состоит в том, что мы берем значение одного из регистров процессора, который указан соответствующем поле команды, прибавляем к нему значение адресного поля и получаем адрес. Такая адресация называется базовой. Если адрес формируется сложением двух или более регистров c адресным полем, то это называется базово-индексной адресацией.

Следует отметить, что способ формирования адреса в процессоре 8086, а также в реальном режиме более поздних процессоров той же линии, представляет собой именно базовую или базово-индексную адресацию.

В этом случае для перемещения программы нам нужно только изменить значения базовых регистров, и программа даже не узнает, что загружена с другого адреса, если только сама не будет перезагружать эти регистры.

Именно так происходит загрузка.com-файлов в системе MS DOS. Система выделяет свободную память, настраивает программе базовые регистры DS и CS, и передает управление на стартовый адрес. Ничего больше делать не надо.

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

Для перемещения программы мы обязаны найти в ней и обработать все ссылки на абсолютные адреса. Такими ссылками могут быть не только адресные поля обычных команд и команды загрузки базовых регистров, но и статически инициализованные указатели, или изощрения в виде косвенной адресации через ячейку памяти

Как бы то ни было, в перемещаемой программе мы вынуждены запоминать все ссылки на абсолютные адреса и в момент загрузки производить их настройку на реальный начальный адрес. Обычно это делается при помощи так называемой таблицы перемещений (relocation table), которая присоединяется к телу загружаемого модуля, и содержит смещения от начала модуля для каждой такой ссылки. Такой файл гораздо сложнее абсолютного загружаемого модуля, и носит название относительного или перемещаемого загрузочного модуля. Именно такой формат имеют.exe-файлы в системе MS DOS.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: