Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗА, 8 сем / Вычислительные машины, системы и сети ЗА, 8 сем / Лекции ВМ системы и сети / Лекция5_Оперативная память / Адресация физической памяти в процессорах Intel 80х86 и совместимых.doc
Скачиваний:
73
Добавлен:
30.03.2015
Размер:
175.1 Кб
Скачать

Сегментная адресация памяти в процессоре 8086 и в r-режимах процессоров старших моделей

Сегментом называется блок смежных адресов. Для процессора 8086 сегменты имеют размер 64К байт, или 65536 байт (с 0 до 65535). Разумеется, сегмент может быть и меньшего размера, однако контроль за этим возлагается на прграммиста. Процессор не контролирует размер сегмента и не отслеживает выход за его границы. Более того, к одному и тому же байту физической памяти можно получить доступ используя разные логические адреса (адреса в программе). Эти ситуации могут привести к серьезным ошибкам, поэтому процессоры старших моделей, начиная с 80286, имеют средства для более гибкого управления сегментами.

При сегментной организации памяти логический адрес (адрес в программе или в процессоре) занимает 32 бита. При этом он состоит из двух 16 разрядных компонент. Первая называется сегментным адресом, и определяет адрес начала сегмента в физической памяти. Вторая называется смещением в сегменте, или просто смещением. Она определяет адрес байта в пределах сегмента. Физический адрес занимает 20 разрядов. Это верно даже для Pentium Pro, если он работает в R-режиме. Преобразование логического адреса в физический (адрес в оперативной памяти) выполняется по очень простой схеме: сегментный адрес сдвигается влево на 4 разряда, после чего к нему прибавляется смещение. Возможный перенос из старшего разряда при сложении игнорируется. Обратите внимание, что в преобразовании логического адреса в физический неявно используется сегментный регистр. CS для получения следующей выполняемой команды, SS для доступа к стеку, DS для доступа к данным. Регистр ES неявно используется только в случае цепочечных команд, в других случаях его надо указывать явно. Регистры FS и GS всегда требуют явного указания.

Логический адрес, состоящий из сегмента и смещения обычно записывают в виде сегмент:смещение. Например адрес из примера можно записать так - FF52:FFF4. Результирующий физический адрес будет 0F514, так как перенос игнорируется. Логический адрес FFFF:FFFF отображается на 0FFEF, то есть 64К минус 16 байт. Однако тут есть одна тонкость. Процессор 80386 и последующие не выполняют игнорирование переноса в R-режиме. Объясняется это очень просто, физический адрес в этих процессорах занимает 32 бита, а от усложнения схемы решили отказаться. Хотя некоторые считают, что в 80386 просто была допущена ошибка, а в последующих моделях ее повторили из-за совместимости. Как бы то ни было, это позволяет на процессорах старших моделей адресовать более 1М в R-режиме. Точнее 1М и еще 64К без 16 байт. Но не все программы могут работать без игнорирования переноса. Выход был найден простой и элегантный. Некоторые наверно слышали про шину, или линию A20. Для адресации 1М памяти требуется 20 адресных линий, с А0 по А19. Адреса с 100000 по 10FFEF, лежащие выше 1М, требуют еще одной адресной линии - А20. Следовательно, если запретить эту линию, переполнение будет игнорироваться, а если разрешить, то память свыше 1М будет доступна и в R-режиме. При работе в V или P режимах линия А20 должнабыть открыта. Подробности управления линией А20 будут рассматриваться в отдельной статье. Кстати, управлением линией А20 занимался драйвер himem.sys в MS-DOS. В Widnows 3.x, в расширенном режиме, линией А20 управлял драйвер WinA20.386.