Программа связывания ЭВМ VAX 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Программа связывания ЭВМ VAX



Редактор связей в системе VAX называется программой связывания (linker) и выполняет функции, аналогичные тем, что мы уже обсуждали в этой главе. Формат объектной программы VAX несколько более сложный, чем формат, использовавшийся для УУМ/ДС. Результатом работы программы связывания является одна или несколько блок-секций (image sections). Блок-секция состоит из нескольких программных секций (PSECT), имеющих сходные значения атрибутов (например, таких как защита по записи или исполнению).

Работа программы связывания по созданию блок-секций управляется ассемблером или компилятором с помощью специальных команд, включаемых в объектную программу. (Запись-модификатор, являющаяся частью объектной программы УУМ/ДС, представляет собой простой пример команды этого типа.) В качестве рабочей памяти программа связывания использует внутренний стек. Команды объектной программы могут заносить в стек разнообразную информацию, считывать значения из стека и записывать их в блок-секцию, а также выполнять операции над величинами, записанными в стек. Набор команд состоит более чем из 50 различных операций, обеспечивающих самые широкие возможности.

На рис. 3.19 приведен простой пример, иллюстрирующий данный способ организации перемещения и связывания. На рис. 3.19а показаны три программные секции, ассемблировавшиеся совместно. По существу это те же программные секции, которые использовались нами в примере на рис. 3.7. Однако здесь показана только та часть, которая необходима для обработки предложения с меткой REF4 (из секции PROGA). На.рис. 3.196 приведен несколько упрощенный вариант команд, обеспечивающих генерацию значения предложения REF4.

Первая команда заносит в вершину стека число 14 (шестнадцатеричное), являющееся значением выражения (ENDA-LISTA). Вторая команда заносит в стек базовый адрес секции PROGC (он назначается программой связывания) плюс смещение 30 (шестнадцатеричное). Эта сумма представляет собой значение метки LISTC. Третья команда суммирует два верхних элемента стека и помещает результат в его вершину. Последняя команда запоминает эту величину в качестве следующего слова генерируемой блок-секции. Это как раз то значение, которое должно содержаться в слове с меткой REF4.

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

 

Адрес Исходное положение

           
     
 


0000 PSECT PROGA

· ·

· ·

· ·

0040 LISTA …

· ·

· ·

· · PSECT 1

0054 ENDA … (PROGA)

· ·

· ·

· REF4 WORD ENDA-LISTA+LISTC

· ·

· ·

· ·

0000 PSECT PROGB

· ·

· · PSECT 2

· · (PROGB)

· ·

0000 PSECT PROGC

· ·

· · PSECT 3

0030 LIST … (PROGC)

· ·

· ·

· END

 

a

 

 

Команда Операнд

       
   


·

·

·

Объектный код и команды Поместить значение в стек Значение=14

перемещения/связывания Поместить в стек базу PSECT PSECT=3{PROGC},

для предложения REF4 в плюс смещение смещение=30

PROGA Сложение

Запомнить слово

·

·

·

 

б

Рис.3.19. Пример использования механизма перемещения и связывания ЭВМ VAX.

 

Третий тип-это системные блок-секции (system mages). Такая блок-секция предназначена для работы на машине без поддержки операционной системы. (Операционная система VAX сама является системной блок-секцией). Эти блок-секции используются только для специальных целей. По сравнению с другими типами блок-секций системная блок-секция имеет более простую структуру.

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

Ссылки между раздельно ассемблируемыми программными секциями обрабатываются так, как было описано в разд. 3.2. Используемые имена Ложны быть объявлены глобальными (т. е. внешними). Определения глобальных имен являются- составной частью объектного представления и используются программой связывания для разрешения внешних ссылок между программными секциями. Различают два типа внешних ссылок- сильные (strong) и слабые (weak). Сильные ссылки обрабатываются обычным образом. Разрешение слабых ссылок осуществляется только в том случае, если секция, в которой определены соответствующие имена, присутствует во входном потоке программы связывания. Автоматический библиотечный поиск для этих ссылок не делается. Неразрешенные слабые ссылки не рассматриваются как ошибки. Вместо этого им присваивается нулевое значение. Одно из применений таких слабых ссылок -тестирование модульных программ. В этом случае может возникнуть желание протестировать часть программы прежде, чем будут написаны все подпрограммы. Если все вызовы к отсутствующим подпрограммам идентифицировать как слабые ссылки, то программу можно будет беспрепятственно загрузить и исполнять. Конечно, если программа попытается вызвать отсутствующую подпрограмму, то в результате будет зафиксирована ошибка. (Редактор связей System/370 и загрузчик ЭВМ CY-BER допускают использование похожих слабых ссылок.)

Определения глобальных переменных обычно отсутствуют в исполняемой блок-секции, поскольку эта секция не предназначена для повторной обработки с помощью программы связывания. Однако в случае использования некоторых средств отладки глобальные имена остаются в исполняемой блок-секции и применяются при выводе диагностических сообщений. В разделяемой блок-секции определения некоторых глобальных имен сохраняются для того, чтобы обеспечить возможность связывания этой секции с другими программами. Эти имена, называемые общими (universal) именами, задаются с помощью команд программы связывания. Глобальные имена, не объявленные общими, в разделяемой блок-секции не сохраняются.

Программа связывания ЭВМ VAX не поддерживает оверлейные программы. Частично это вызвано тем, что в системе VAX предоставляется виртуальная память большого объемам Разработчики системы сочли, что большой объем виртуальной памяти и применение алгоритмов управления этой памятью делают ненужным использование оверлейных структур. (Напомним, однако, что в System/370 редактор связей поддерживает оверлейные программы и на системах с виртуальной памятью.) Дополнительную информацию по системе VAX вы можете найти в DEC [1982] и DEC [1978].

Загрузчик ЭВМ CYBER

Формат объектной программы, используемый в системе CYBER, отчасти более сложный, чем формат УУМ/ДС. Однако он содержит ту же самую базовую информацию. Для задания информации о связывании используется механизм, сходный с рассмотренными нами записями-модификаторами. Родственный механизм может быть использован для описания требуемых перемещений. Наряду с этим для описания перемещений может использоваться аппарат, похожий на аппарат масок перемещения, рассмотренный нами в разд. 3.2.1. Маски перемещения особенно полезны в системе CYBER, поскольку в ней нет относительной адресации. Это означает, что в общем случае программы CYBER содержат намного больше величин, требующих перемещения, чем аналогичные программы для VAX или System/370.

В каждом слове CYBER может храниться не одна команда, а несколько. Поэтому в маске перемещения недостаточно иметь по одному разряду на каждое слово. Поскольку в CYBER адреса оперативной памяти могут присутствовать только в командах, использующих 30-разрядный формат, то имеется пять возможных вариантов размещения перемещаемой величины внутри слова:

1. перемещение не требуется;

2. перемещаемое значение находится в левой половине слова;

3. перемещаемое значение находится в правой половине слова;

4. перемещаемые значения находятся в обеих половинах слова;

5. перемещаемое значение находится в середине 30-разрядного слова.

Поэтому, когда используется аппарат масок перемещения, каждому слову сопоставляется 4-разрядное поле. Это поле используется для кодирования перечисленных выше вариантов и для указания операции, которую надо выполнить для модификации перемещаемых значений (либо прибавить базовый адрес к перемещаемому значению, либо вычесть).

Загрузчик CYBER поддерживает оверлейные программы, но на их структуру накладываются более жесткие ограничения. Оверлейная структура ограничена максимум тремя уровнями. Сегмент идентифицируется упорядоченной парой целых чисел и может содержать только одну входную точку. Каждый сегмента кроме корневого, загружается по явному запросу. Автоматическая загрузка сегментов не предусмотрена. Прикладные программы могут запросить загрузку сегмента, обратившись к операционной системе. В качестве альтернативы допускается использование небольшого резидентного загрузчика, обеспечивающего оверлейную загрузку. Этот загрузчик может быть включен в корневой сегмент.

Имеется также и более мощное средство организации оверлейного процесса, которое называется сегментацией (segmentation). Сегментированная программа также должна иметь древовидную структуру, однако допускается использование более трех уровней и каждый сегмент может иметь несколько входных точек. Разрешается, кроме того использовать оверлейные программы, размещенные в нескольких областях памяти. Такая организация оверлейной структуры похожа на то, что мы рассматривали для System/370 (хотя и используется другая терминология). Программист с помощью командного языка может явно задать древовидную структуру, указав, какие программы должны включаться в соответствующие сегменты. Если это не сделано, то загрузчик распределяет программы между сегментами, исходя из анализа существующих между ними внешних связей.

В дополнение к стандартным функциям загрузчик CYBER позволяет создавать так называемые капсулы (capsules). Капсула состоит из одной или нескольких объектных программ, связанных между собой и записанных в специальном формате, позволяющем осуществлять быструю загрузку. Для того чтобы загрузить капсулу в оперативную память, прикладные программы могут вызвать быстрый динамический загрузчик (Fast Dynamic Loader - FDL). Загрузка с помощью FDL более эффективна, чем другие методы загрузки, и требует меньших ресурсов оперативной памяти, однако она накладывает более жесткие ограничения и сложнее в использовании.

Дополнительную информацию о загрузчике CYBER можно найти в СDС [1982б].

УПРАЖНЕНИЯ

Раздел 3.1

1. Определите двоичный формат объектной программы для УУМ и напишите абсолютный загрузчик (на языке ассемблера УУМ), позволяющий загружать программы в этом формате.

2. Опишите метод преобразования объектной программы, формат которой использует символьное представление ассемблированного кода (см. рис. 3.1а) в машинное представление. Как бы вы реализовали его на языке ассемблера УУМ?

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

Раздел 3.2

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

2. Предположим, что в некоторой ЭВМ. в основном используется прямая адресация, но имеются различные командные форматы. Какие проблемы возникают в связи с этим, если для настройки относительных адресов использовать маски перемещения? Как их можно разрешить?

3. Примените алгоритм, показанный на рис. 3.10, для связывания и загрузки объектной программы на рис. 3.8. Сравните ваш результат с тем, что изображено на рис. 3.9.

4. Предположим, что PROGA, PROGB и PROGC те же, что и на рис. 3.9. Покажите, как изменится объектная программа (включая записи тела программы и записи-модификаторы), если в каждую программу добавить следующие предложения:

REF9 WORD LISTC

REF10 WORD LISTB-3

REF11 WORD LISTA+LISTB

REF12 WORD ENDC-LISTC-100

REF13 WORD LISTA-LISTB-ENDA+ENDB

5. Примените алгоритм, показанный на рис. 3.10, для связывания и загрузки модифицированной объектной программы, сгенерированной вами в упр.4.

6. Включите в алгоритм на рис. 3.10 средства для обнаружения в выражениях некорректного использования внешних имен. (Список правил см. в разд. 2.3.5.) Какие проблемы возникают при проведении подобных проверок?

7. Модифицируйте алгоритм -на рис. 3.10 так, чтобы в нем использовались номера ссылок, как это было описано в разд. 3.2.3.

8. В некоторых загрузчиках используется косвенная схема связывания. Для того чтобы использовать подобную схему в УУМ/ЯС,.ассемблер должен был бы сгенерировать список указателей для всех имен, перечисленных в предположениях EXTREF. (Один указатель на каждое внешнее имя.) С помощью записей-модификаторов загрузчику было бы предписано занести значения адресов соответствующих внешних имен в эти указатели. Тогда внешние ссылки можно было бы осуществлять посредством косвенной адресации через эти указатели. Так, например, команда вида

LDA XYZ

(где XYZ - внешняя ссылка) ассемблировалась бы так, как если бы она имела вид

LDA @PXYZ

где PXYZ - указатель на XYZ. В чем преимущества и недостатки этого метода?

9. Предложите проект однопросмотрового связывающего загрузчика. Какие ограничения (если они нужны) требуется наложить в этом случае? В чем преимущества и недостатки такого однопросмотрового загрузчика?

10. Некоторые языки программирования разрешают размещать данные в общих областях памяти (имеются в виду области типа COMMON языка Фортран). Исходная программа может содержать несколько общих областей (с разными именами). Мы можем рассматривать каждую общую область как отдельную управляющую секцию.

При связывании и загрузке программ общим областям с одинаковыми именами присваивается один и тот же начальный адрес. (Эти общие области в разных программах могут иметь различную длину.) Таким образом, устанавливается соответствие между переменными общих, областей, объявленными в различных программах. Любые данные, записанные в общую область одной программой, становятся доступными для других.

Как мог бы загрузчик обрабатывать такие общие области? (Предложите способ модификации алгоритма на рис. 3.10 для обеспечения работы с общими областями.)

Раздел 3.3.

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

2. Модифицируйте алгоритм на рис. 3.10 так, чтобы он позволял обрабатывать команды CHANGE, DELETE и INCLUDE, описанные в разд. 3.3.2. Если потребуется, вы можете ввести необходимые ограничения на их не пользование.

3. Предположим, что загрузчик готовит листинг, который включает на только адреса, присвоенные внешним именам, но и таблицу перекрестные; ссылок между загружаемыми управляющими секциями. Какая информации может быть полезна в таком листинге? Коротко опишите способ реализации этой возможности и дайте определения необходимых для этого структур данных.

4. Рассмотрим оверлейную структуру, показанную на рис. 3.12а. Предположим, что подпрограмма Н может быть вызвана не только из В но и из С. Как это можно реализовать в оверлейной программе? (Считаем, что правила оверлея, определенные в разд. 3.3.3, не меняются.)

5. Опишите алгоритм назначения начальных адресов сегментам оверлейной структуры, принимая во внимание объем памяти, необходимый для размещения SEGTAB и OVLMGR.

6. Во время выполнения оверлейной программы существует много различных наборов сегментов, которые могут находиться в памяти в различные моменты времени. На рис. 3.14б показаны три возможных варианта для программы на рис. 3.12а. Приведите другие варианты, используя аналогичную форму представления.

7. Дайте краткое описание процедуры управления оверлеем, которую мы назвали OVLMGR. Определите необходимые для нее структуры данных.

8. Предположим, что мы хотим разрешить иметь в сегментах оверлейной программы более чем одну входную точку. Например, в программе на рис. 3.12а мы хотели бы непосредственно из сегмента А обращаться либо к входу D, либо к входу Е. При этом независимо от того, по какому входу будет сделан вызов, должен загружаться весь сегмент D/E. Каким образом может быть реализована такая возможность - загрузчиком и (или) менеджером оверлея?

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

Раздел 3.4

1. Определите формат модуля, подходящий для представления связанной программы, генерируемой редактором связей. Будем считать, что связанная программа не предназначена для повторной обработки с помощью редактора связей. Опишите алгоритм перемещающего загрузчика, который можно использовать для загрузки модулей данного формата.

2. Рассмотрим следующие варианты хранения, связывания и исполнения пользовательской программы.

а) Хранится только исходная программа; при каждом запуске программы она переассемблируется и загружается связывающим загрузчиком.

б) Хранятся исходная программа и ее объектное представление; при каждом запуске программы она загружается с помощью связывающего загрузчика.

в) Хранятся исходная программа и вариант программы, подготовленный редактором связей, в котором оставлены неразрешенными ссылки на библиотечные подпрограммы; при каждом запуске программы она загружается с помощью связывающего загрузчика.

г) Хранятся исходная программа и вариант программы, подготовленный редактором связей, в котором разрешены все внешние ссылки; при каждом запуске программы она загружается с помощью связывающего загрузчика.

д) Хранятся исходная программа и вариант программы, подготовленный редактором связей, в котором разрешены все внешние ссылки и выполнена настройка относительных адресов; при каждом запуске программы она загружается с помощью абсолютного загрузчика.

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

3. Динамическое связывание и оверлейная загрузка имеют много общих черт. Сопоставьте эти два подхода с точки зрения эффективности, простоты использования и других важных, на ваш взгляд, факторов. В каких случаях каждый из этих подходов предпочтительнее другого?

4. Динамическое связывание, как оно было описано в разд. 3.4.2,. работает только для передачи управления. Как его можно приспособить для того, чтобы оно обеспечивало динамическую загрузку и при ссылках на данные?

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

6. Предположим, что требуется удалить из памяти динамически загруженную подпрограмму (для повторного использования пространства памяти). Будет ли предложенный вами в упр.5 метод работать в этом случае? Какие возникают здесь проблемы и как они могут быть разрешены?

7. Предположим, что нажатие на пульте УУМ/ДС кнопки "старт системы" вызывает чтение с вводного устройства 128-разрядной записи, которая размещается в оперативной памяти, начиная с адреса 0000. После того как запись прочитана, управление автоматически передается по адресу 0000. Какие команды должны находиться в первой раскручивающей записи для того, чтобы можно было загрузить следующую за ней абсолютную объектную программу? Для раскручивающей записи и объектной программы вы можете выбрать любой удобный вам формат.

 

ГЛАВА 4.



Поделиться:


Последнее изменение этой страницы: 2017-02-17; просмотров: 169; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.204.208 (0.046 с.)