![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Сегментирование памяти
Говоря об адресации, нельзя обойти вопрос о сегментировании памяти, применяемой в некоторых процессорах, например в процессорах 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 в так называемом защищенном режиме адрес памяти вычисляется в соответствии с рис. 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 Кбайта. В любом случае сегментирование позволяет выделить в памяти один или несколько сегментов для данных и один или несколько сегментов для программ. Переход от одного сегмента к другому сводится всего лишь к изменению содержимого сегментного регистра. Иногда это бывает очень удобно. Но для программиста работать с сегментированной памятью обычно сложнее, чем с непрерывной, несегментированной памятью, так как приходится следить за границами сегментов, за их описанием, переключением и т.д.
|