Cтраница 1
Связывающие загрузчики являются наиболее развитыми. [1]
Непосредственно связывающий загрузчик наиболее полно обеспечивает возможность перемещения в памяти программ и данных и в настоящее время является наиболее распространенным. [2]
Непосредственно связывающий загрузчик обладает тем преимуществом, что допускает использование большого числа как программных сегментов, так и сегментов данных и дает программисту полную свободу в обращении к данным или командам, содержащимся в других сегментах. Это обеспечивает гибкие перекрестные обращения между сегментами и возможности доступа, допуская в то же время независимую трансляцию-программ. [3]
Типичный непосредственно связывающий загрузчик использует два просмотра объектной программы. Во время первого просмотра распределяется память для сегментов и определяются значения внешних символов. Во время второго просмотра текст программы загружается в память и адресные константы настраиваются с помощью глобальной таблицы внешних символов, построенной при первом просмотре. [4]
Структура непосредственно связывающего загрузчика будет рассмотрена в этой главе. В то время как формат сам по себе может быть в некотором смысле произвольным, информация, которую ассемблер должен передать загрузчику, должна иметь вполне определенное содержание. [5]
При использовании связывающего загрузчика для получения готовой к выполнению программы, всякий раз, когда программа запускается, применяются все четыре основные функции загрузчика. Однако при производственном счете программа может несколько раз выполняться в одном и том же виде, причем только ее начальный адрес может изменяться в зависимости - от различной обстановки в мультипрограммной среде ( разд. Это означает, что при связывании нет необходимости повторять несколько шагов. Чтобы сделать эту процедуру более экономичной и сохранить время вычислительной машины, во многих операционных системах функции непосредственно связывающих загрузчиков разделены. Загрузчик разбивается на две отдельные программы, редактор связей и загрузчик модулей. [6]
Загрузчик ( или связывающий загрузчик) - это транслятор, у которого объектным языком являются готовые к выполнению машинные команды, а исходный язык почти идентичен объектному - обычно состоит из программ на машинном языке в перемещаемой форме и таблиц данных, указывающих точки, где перемещаемый код должен быть модифицирован, чтобы стать полностью выполнимым. [7]
Перемещающий ассемблер и связывающий загрузчик решают эти задачи следующим образом. Во-первых, ассемблер производит объектный код в предположении, что начальный адрес каждой программы равен нулю. Во-вторых, он отмечает каждый относительный адрес или слово данных таким образом, что загрузчик будет знать, на какие части программы влияет перемещение. В-третьих, в ассемблере предусмотрена для программиста возможность объявления некоторых идентификаторов глобальными. Глобальный идентификатор объявляется либо в данной программе меткой или оператором прямого присваивания, либо это может быть сделано в другой программе, транслируемой отдельно. В первом случае глобальный символ называется идентификатором входа, а во втором - внешним идентификатором. [8]
Пример листинга программы LINK RT-11. [9] |
Эта информация необходима связывающему загрузчику для создания схемы загрузки, так как детализирует, какие программы должны быть загружены, каковы их длины, где они размещаются в памяти и какие другие программы требуются для их выполнения. Загрузчик работает до тех пор, пока не будут загружены все программы и не останется неудовлетворенных ссылок или же нужной ему программы не окажется среди доступных. [10]
Одним из недостатков непосредственно связывающего загрузчика в том виде, как он был рассмотрен нами ранее, является необходимость при каждом выполнении программы повторно выполнять функции распределения памяти, перемещения, связывания и загрузки всех необходимых подпрограмм. Кроме того, хотя загрузчик и занимает меньше места, чем-ассемблер, все-таки он требует выделения значительного места в памяти. [11]
Загрузка с использованием векторов передачи. [12] |
Второй метод используется в связывающих загрузчиках и основывается на стремлении избежать одного уровня косвенной адресации, необходимого для векторов передачи. С этой целью строится связанный список вызовов внешних программ, он сохраняется до тех пор, пока относительные адреса внешних программ не станут известны. Теперь загрузчик разворачивает список и формирует прямые вызовы внешних программ. [13]
Хотя назначение ассемблера и непосредственно связывающего загрузчика совершенно различно, их структура и процесс проектирования имеют много сходных черт. В частности, в обоих случаях важную роль играет использование таблицы символов. [14]
В этом разделе рассматривался двупросмотровый непосредственно связывающий загрузчик. [15]