Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Сегментирование памяти






Говоря об адресации, нельзя обойти вопрос о сегментировании памяти, применяемой в некоторых процессорах, например в процессорах IBM PC-совместимых персональных компьютеров.

В процессоре Intel 8086 сегментирование памяти организовано следующим образом.

Вся память системы представляется не в виде непрерывного пространства, а в виде нескольких кусков – сегментов заданного размера (по 64 Кбайта), положение которых в пространстве памяти можно изменять программным путем.

Для хранения кодов адресов памяти используются не отдельные регистры, а пара «сегментный регистр – смещение в сегменте»:

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

– смещение (эффективный адрес) определяет положение информации внутри сегмента, оно вычисляется по формуле

Смещение = База + Индекс + Отклонение,

где База и Индекс – компоненты адреса, извлекаемые из регистров, что позволяет их изменять во время выполнения программы (например, при просмотре элементов массива), а Отклонение – константа, определяемая на этапе трансляции (это может быть начальный адрес (адрес первого элемента массива) или смещение поля в записи).

В процессорах Intel 8086 имелось 4 сегментных регистра: DS, ES – регистры, базирующие сегменты данных, CS – базовый регистр для сегмента кода, SS – базовый регистр для сегмента стека. В процессорах старших моделей набор сегментных регистров расширен.

В качестве адресных регистров для вычисления эффективного адреса используются регистры общего назначения: BX – регистр базы, SI, DI – индексные регистры при доступе к данным в сегменте данных (по умолчанию для доступа к данным используется регистр DS); IP – регистр-указатель команды (используется в паре с CS), SP и BP используются для работы со стеком в паре с SS.

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

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

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

Рис. 5.2. Формирование физического адреса памяти из адреса сегмента и смещения

Рис. 5.3. Физический адрес в сегменте (все коды – шестнадцатеричные).

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

Отметим, что введение сегментирования, прежде всего, связано с тем, что внутренние регистры процессора 16-разрядные, а физический адрес памяти 20-разрядный (16-разрядный адрес позволяет использовать память только в 64 Кбайт, что явно недостаточно). В появившемся в то же время процессоре MC68000 фирмы Motorola внутренние регистры 32-разрядные, поэтому там проблемы сегментирования памяти не возникает.

Рис. 5.4. Адресация памяти в защищенном режиме процессора
Intel 80x86

Применяются и более сложные методы сегментирования памяти. Например, в процессорах Intel 80x86 в так называемом защищенном режиме адрес памяти вычисляется в соответствии с рис. 5.4.

В сегментном регистре в данном случае хранится не базовый (начальный) адрес сегментов, а коды селекторов, определяющие адреса в памяти, по которым хранятся дескрипторы (то есть описатели) сегментов. Область памяти с дескрипторами называется таблицей дескрипторов. Каждый дескриптор сегмента содержит базовый адрес сегмента, размер сегмента (от 1 до 64 Кбайт) и его атрибуты. Базовый адрес сегмента имеет разрядность 24 бит, что обеспечивает адресацию 16 Мбайт физической памяти.

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

Рис. 5.5. Формирование 32-разрядного физического адреса памяти процессора 80x86 в защищенном режиме

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

Адрес памяти (физический адрес) вычисляется в три этапа. Сначала вычисляется так называемый эффективный адрес (32-разрядный) путем суммирования трех компонентов: базы, индекса и смещения (Base, Index, Displacement), причем возможно умножение индекса на масштаб (Scale). Эти компоненты имеют следующий смысл:

– смещение – это 8-, 16- или 32-разрядное число, включенное в команду.

– база – это содержимое базового регистра процессора. Обычно оно используется для указания на начало некоторого массива.

– индекс – это содержимое индексного регистра процессора. Обычно оно используется для выбора одного из элементов массива.

– масштаб – это множитель (он может быть равен 1, 2, 4 или 8), указанный в коде команды, на который перед суммированием с другими компонентами умножается индекс. Он используется для указания размера элемента массива.

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

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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.