Понятие адресного пространства, сегмента и логической памяти
Поскольку прямое обращение процессов к физической памяти может приводить к повреждению хранящихся там данных и существует реальная необходимость запуска одновременно нескольких программ (процессов), было предложено следующее решение: для каждого процесса в операционной системе организована своя абстракция, называемая адресным пространством. Каждый процесс связан с этой абстракцией и как бы работает на своем процессоре, никак не связанном с физическим процессором. Адресное пространство – это набор адресов, который может быть использован процессором для обращения к памяти. Абстракция адресного пространства поддерживается только в процессорах, имеющих адресную шину. Адресное пространство не обязательно должно быть числовым. Например, DNS содержит имена доменов (город – набор улиц) и это тоже адресное пространство. Физическое адресное пространство ограничено размером физической памяти, установленной на компьютере, Логическое адресное пространство определяется разрядностью процессора и операционной системой. Для 16 разрядный процессоров или операционных систем это 2^16 адресов, а для 64 битных – 2^^64.
Введение абстракции адресного пространства позволило программистам отвлечься от физической организации модулей оперативной памяти и считать, что им предоставлен непрерывный набор свободных адресов. Такое представление называется логической памятью.
Для размещения абстрактных адресов в физической памяти в процессоре изначально использовался специальный ограничительный регистр, в котором располагался адрес смещения. Допустим, после загрузки операционной системы, в нем хранится адрес 16384 (смещение на 16 кб). Тогда следующий процесс, запускаемый на компьютере, будет использовать адреса начиная с 0+16384, хотя сам процесс будет считать, что загружается с 0 адреса. Следующий процесс получит физические адреса с адреса 32764+0 и т.д.
Такая схема управления памятью называется сегментацией. Сегмент – область памяти определенного назначения, внутри которой поддерживается линейная адресация. Сегменты содержат данные работающих процессов: процедуры, массивы, стек или скалярные величины. В дальнейшем сегменты получили большое распространение, поскольку можно изначально определить несколько сегментов как системных сегментов, содержащих фрагменты программного кода общего для всех процессов и сделать ссылку на него для всех создаваемых процессов.
Логическая память, таким образом, перестала быть линейной и превратилась в двумерную. Адрес состоит из двух компонентов: номер сегмента, смещение внутри сегмента. Далее оказалось удобным размещать в разных сегментах различные компоненты процесса (код программы, данные, стек и т. д.). Попутно выяснилось, что можно контролировать характер работы с конкретным сегментом, приписав ему атрибуты, например права доступа или типы операций, которые разрешается производить с данными, хранящимися в сегменте.
Рис.42 Сегменты процессов А и B
Некоторые сегменты, описывающие адресное пространство процесса, показаны на рисунке.
Большинство созданных ОС поддерживают сегментную организацию памяти. В некоторых архитектурах, например Intel и AMD, сегментация поддерживается на уровне оборудования.
Адреса, к которым обращается процесс, таким образом, отличаются от адресов, реально существующих в оперативной памяти. В каждом конкретном случае используемые программой адреса могут быть представлены различными способами. Например, адреса в исходных текстах обычно символические. Компилятор связывает эти символические адреса с перемещаемыми адресами (такими, как n байт от начала модуля). Подобный адрес, сгенерированный программой, обычно называют логическим (в системах с виртуальной памятью он часто называется виртуальным) адресом. Совокупность всех логических адресов называется логическим (виртуальным) адресным пространством.
Связывание адресов
Итак логические и физические адресные пространства ни по организации, ни по размеру не соответствуют друг другу. Максимальный размер логического адресного пространства обычно определяется разрядностью процессора (например, 264) и в современных системах значительно превышает размер физического адресного пространства. Следовательно, процессор и ОС должны быть способны отобразить ссылки в коде программы в реальные физические адреса, соответствующие текущему расположению программы в основной памяти. Такое отображение адресов называют трансляцией (привязкой) адреса или связыванием адресов
Связывание логического адреса, порожденного оператором программы, с физическим должно быть осуществлено до начала выполнения оператора или в момент его выполнения. Таким образом, привязка инструкций и данных к памяти в принципе может быть сделана на следующих шагах [Silberschatz, 2002].
- Этап компиляции (Compile time). Когда на стадии компиляции известно точное место размещения процесса в памяти, тогда непосредственно генерируются физические адреса. При изменении стартового адреса программы необходимо перекомпилировать ее код. В качестве примера можно привести .com программы MS-DOS, которые связывают ее с физическими адресами на стадии компиляции.
- Этап загрузки (Load time). Если информация о размещении программы на стадии компиляции отсутствует, компилятор генерирует перемещаемый код. В этом случае окончательное связывание откладывается до момента загрузки. Если стартовый адрес меняется, нужно всего лишь перезагрузить код с учетом измененной величины.
- Этап выполнения (Execution time). Если процесс может быть перемещен во время выполнения из одной области памяти в другую, связывание откладывается до стадии выполнения. Здесь желательно наличие специализированного оборудования, например регистров перемещения. Их значение прибавляется к каждому адресу, сгенерированному процессом.
Большинство современных ОС осуществляет трансляцию адресов на этапе выполнения, используя для этого специальный аппаратный механизм
Рис 4.4 Связывание адреса
Дата добавления: 2018-09-24; просмотров: 1657;