Физическое и логическое адресное пространство 


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



ЗНАЕТЕ ЛИ ВЫ?

Физическое и логическое адресное пространство



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

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

Преобразование виртуальных адресов в физические выполняется специальным блоком управления памятью MMU (memory management unit). Существуют различные схемы такого преобразования. В простейшей схеме используется регистр базы (base relocation register). Значение этого регистра просто прибавляется к каждому адресу программы (см. рис. 11.1)

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

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

Концепция отделения логического адресного пространства от физического является центральной в управлении памятью.

Рисунок 11.1 – Простейшая схема преобразования логического адреса в физический

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

Итак, логические и физические адресные пространства ни по организации, ни по размеру не соответствуют друг другу. Максимальный размер логического адресного пространства обычно определяется разрядностью процессора (например, 232) и в современных системах значительно превышает размер физического адресного пространства. Следовательно, процессор и ОС должны быть способны отобразить ссылки в коде программы в реальные физические адреса, соответствующие текущему расположению программы в основной памяти. Такое отображение адресов называют трансляцией (привязкой) адреса или связыванием адресов.

Связывание логического адреса, порожденного оператором программы, с физическим должно быть осуществлено до начала выполнения оператора или в момент его выполнения. Таким образом, привязка команд и данных к памяти в принципе может быть сделана на следующих шагах (см. рис. 11.2).

Рисунок 11.2 – Этапы жизненного цикла программы

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

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

- Этап выполнения (Execution time). Если процесс может быть перемещен во время выполнения из одной области памяти в другую, связывание откладывается до стадии выполнения. Здесь желательно наличие специализированного оборудования, например регистров перемещения. Их значение прибавляется к каждому адресу, сгенерированному процессом. Большинство современных ОС осуществляет трансляцию адресов на этапе выполнения, используя для этого специальный аппаратный механизм.

Динамическая загрузка

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

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

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

Динамическое связывание

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

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

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

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

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



Поделиться:


Последнее изменение этой страницы: 2016-08-16; просмотров: 1317; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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