Защищенный режим процессоров Intel 80286/80386/80486© Александр Фролов, Григорий ФроловТом 4, М.: Диалог-МИФИ, 1993, 234 стр. 1.1. Адресация памяти в реальном режимеВы наверное знаете, что для работы с памятью используются две шины - шина адреса и шина данных. Физически память устроена таким образом, что возможна адресация как 16-битовых слов, так и отдельных байтов памяти. Кроме того, процессоры i80386 и i80486 могут адресовать 32-битовые слова памяти. В любом случае так называемый физический адрес передаётся из процессора в память по шине адреса. Ширина шины адреса определяет максимальный объём физической памяти, непосредственно адресуемой процессором. На рис. 1 показана схема взаимодействия процессора и памяти через шины адреса и данных.
Рис. 1. Шина адреса и шина данных Например, компьютер IBM XT оснащён 20-разрядной шиной адреса и 16-разрядной шиной данных. Это означает, что имеется возможность адресоваться к 216 байтам памяти, т.е. к 1 мегабайту памяти. Причём возможно адресоваться к байтам и словам размером в 16 бит. Так как адреса принято записывать в шестнадцатеричной форме, то мы можем записать диапазон физических адресов для 20-разрядной шины адреса следующим образом: 00000h <= [физический адрес] <= FFFFFh Таким образом, для представления физического адреса в компьютерах IBM PC и IBM XT используется двадцать двоичных или пять шестнадцатеричных разрядов. Однако все регистры процессора i8086 являются 16-разрядными. Возникает проблема представления 20-разрядного физического адреса памяти при помощи содержимого 16-разрядных регистров. Для разрешения этой проблемы используется двухкомпонентный логический адрес. Логический адрес состоит из 16-разрядных компонент: компоненты сегмента памяти и компоненты смещения внутри сегмента. Для получения 20-разрядного физического адреса к сегментной компоненте приписывается справа четыре нулевых бита (для расширения до 20 разрядов), затем полученное число складывается с компонентой смещения. Перед сложением к компоненте смещения слева дописывается четыре нулевых бита (также для расширения до 20 разрядов). Эту процедуру иллюстрирует рис. 2.
Рис. 2. Адресация памяти в реальном режиме. Логический адрес принято записывать в форме <сегмент:смещение>. Например, пусть у нас есть логический адрес 1234h:0123h. Сегментная компонента равна 1234h, компонента смещения - 0123h. Вычислим физический адрес, соответствующий нашему логическому адресу:
Очевидно, что одному физическому адресу может соответствовать несколько логических. Например, физическому адресу 12453h соответствует логический адрес 1245h:0003h. Фактически в схеме адресации памяти реального режима вся память как бы разбивается на сегменты. Физический адрес начала сегмента (базовый адрес сегмента) равен расширенной до 20 бит сегментной компоненте адреса (расширение выполняется дописыванием справа 4 нулевых бит). Сегменты могут начинаться не с любого физического адреса, а только с такого, который кратен 16 байтам. Поэтому сегмент может начинаться только с границы параграфа. Компонента смещения при такой схеме адресации является смещением внутри сегмента памяти. А сам сегмент памяти задаётся сегментной компонентой. Рис.3 иллюстрирует сказанное выше. На этом рисунке показано соответствие логического адреса 0002h:0028h физическому адресу 00048h.
Рис. 3. Соответствие логического и физического адресов. Логический адрес должен находиться в следующих пределах: 0000h:0000h <= [логический адрес] <= FFFFh:000Fh Здесь есть одна тонкость. Логический адрес FFFFh:000Fh соответствует максимально возможному физическому адресу FFFFFh. Но используя 16-разрядные регистры процессора вы можете задать и большее значение для логического адреса, например, FFFFh:0010h. Что произойдёт в этом случае? Если в компьютере установлены процессоры i8086 или i8088, произойдёт переполнение адреса, которое будет проигнорировано процессором. В результате логическому адресу FFFFh:0010h будет соответствовать физический адрес 00000h. Если же используются процессоры i80286, i80386 или i80486, физическая шина адреса шире 20 бит. Для процессора i80286 шина адреса имеет ширину 24 бита, а для процессоров i80386 и i80486 - 32 бита. При работе в реальном режиме используются младшие 20 адресных линий - от A0 до A19, остальные адресные линии аппаратура компьютера блокирует. Однако есть возможность снять блокировку с адресной линии A20. При этом в реальном режиме появляется ещё один "льготный" сегмент памяти, лежащий выше границы первого мегабайта. Этот сегмент называется областью старшей памяти (High Memory Area). Ему соответствует диапазон логических адресов от FFFFh:0010h до FFFFh:FFFFh. Размер области старшей памяти составляет 64 килобайта без 16 байт. Операционная система MS-DOS умеет использовать старшую область памяти, располагая там своё ядро. Для этого необходимо подключить драйвер HIMEM.SYS и поместить в файл CONFIG.SYS строку: DOS=HIGH Архитектура процессоров серии i80XXX, работающих в реальном режиме, предполагает хранение сегментной компоненты адреса в специальных сегментных регистрах: CS - сегмент кода; DS - сегмент данных; ES - дополнительный сегмент данных; SS - сегмент стека. Компонента смещения может находиться в регистрах BX, BP, SI, DI, IP. Задавая произвольные значения сегментной компоненты и компоненты смещения любая программа может адресоваться к любому участку памяти компьютера. В частности, любая программа может преднамеренно или из-за ошибки разрушить области данных, принадлежащие операционной системе. Выделим два основных недостатка схемы адресации памяти реального режима:
Этих недостатков полностью лишена схема адресации памяти, которая используется в защищённом режиме. |