double arrow

Связывание адресов


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

Адреса, с которыми имеет дело менеджер памяти, бывают:

- логические (виртуальные для систем с виртуальной памятью);

- физические.

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

Набор адресов, сгенерированный программой, называют логическим (виртуальным) адресным пространством, которому соответствует физическое адресное пространство.

Максимальный размер логического адресного пространства обычно определяется разрядностью процессора (например, 2**32) и в современных системах значительно превышает размер физического адресного пространства.

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

Обычно программа при компиляции проходит нескольких шагов:

а) текст на алгоритмическом языке;

б) объектный модуль;

в) загрузочный модуль;

г) бинарный образ в памяти.

Используемые программой адреса в каждом конкретном случае могут быть представлены различными способами. Например, адреса в исходных текстах обычно символические. Компилятор связывает эти символические адреса с перемещаемыми адресами (такими как n байт от начала модуля). Загрузчик или линкер, в свою очередь, связывают эти перемещаемые адреса с виртуальными адресами. Каждое связывание - отображение одного адресного пространства в другое (рис.9.1).

Рисунок 9.1 - Этапы связывания адресов

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

1) Этап компиляции (Compile time). Когда на стадии компиляции известно точное место размещения процесса в памяти, тогда генерируются абсолютные адреса. Если стартовый адрес программы меняется, необходимо перекомпилировать код. Например, .com программы MS-DOS, которые связывают ее с физическими адресами на стадии компиляции.

2) Этап загрузки (Load time). Если на стадии компиляции не известно где процесс будет размещен в памяти, компилятор генерирует перемещаемый код. В этом случае окончательное связывание откладывается до момента загрузки. Если стартовый адрес меняется, нужно всего лишь перезагрузить код с учетом измененной величины.

3) Этап выполнения (Execution time). Если процесс может быть перемещен во время выполнения из одного сегмента памяти в другой, связывание откладывается до времени выполнения. Здесь желательно специализированное оборудование, например регистры перемещения. Их значение прибавляется к каждому адресу, сгенерированному процессом. Например, MS-DOS использует четыре таких (сегментных) регистра.


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