Перемещаемые модули.
Программные модули, обладающие свойством перемещаемости, могут быть во время счёта программы перенесены в другое место оперативной памяти так, что это не повлияет на правильную работу этих модулей.
Рассмотрим пример, когда это свойство исполняемых модулей может оказаться полезным. На рис. 10.7 показан вид рабочего поля, на котором находятся процедуры с именами A и Delta. Предположим, что динамическому загрузчику необходимо разместить на этом поле новый модуль, скажем процедуру с именем C12, которая имеет длину 8000 байт. Видно, что загрузчику не удастся это сделать, не удалив с рабочего поля какую-нибудь процедуру, так как, несмотря на то, что 10000 байт рабочего поля свободны, но это свободное пространство разбито на две части, ни в одну из которых не войдёт процедура C12.
В том случае, если модуль Delta является перемещаемым, его можно сдвинуть так, чтобы объединить свободные участки рабочего поля и разместить на нём новую процедуру C12. Сдвиг модуля в оперативной памяти является по существу операцией пересылки массива и это заведомо более быстрая операция, чем удаление модуля с рабочего поля (ведь его потом, скорее всего, придётся вернуть обратно).
Рассмотрим, какими свойствами должен обладать модуль на Ассемблере, чтобы быть перемещаемым. При перемещении сегментов модуля на другое место памяти должны поменяться адреса начал этих сегментов в сегментных регистрах. Отсюда вытекает следующее ограничение на перемещаемый модуль: он не должен загружать значения сегментных регистров (как следствие он не может использовать более 4 сегментов). Следовательно, в нашей архитектуре модуль не может выполнять следующие команды
§ Команды пересылки вида mov SR,op2 , то есть загружать в сегментный регистр значение длинного регистра r16 или слова из памяти m16. Напомним, что параметр SR может принмать значения сегментных регистров DS, ES и SS.
§ Команды чтения из стека в сегментный регистр pop SR .
§ Команды дальнего возврата ret в свой собственный сегмент кода, т.е. выполнять дальний возврат внутри самого модуля.
Кроме того, такой модуль нельзя перемещать в другое место памяти во время выполнения системного вызова по команде int i8 , так как возврат из процелуры-обработчика прерывания производится по команде iret , которая, как мы знаем, тоже загружает кодовый сегментный регистр.
Из этих свойств видно, что хорошим кандидатом на перемещаемый модуль является процедура на Ассемблере (понять это). На первых ЭВМ перемещаемость была очень полезным свойством выполняемого модуля, так как позволяла уменьшить операции обмена с медленной внешней памятью. На современных ЭВМ, однако, появился механизм виртуальной памяти, который позволяет использовать большое логическое адресное пространство, и перемещаемость перестала быть важной характеристикой исполняемых модулей. Виртуальную память Вы будете изучать в курсе "Системное программное обеспечение".
Дата добавления: 2015-10-05; просмотров: 834;