Адресация памяти в реальном режиме
Вы наверное знаете, что для работы с памятью используются две шины - шина адреса и шина данных. Физически память устроена таким образом, что возможна адресация как 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. Вычислим физический адрес, соответствующий нашему логическому адресу:
- расширяем до 20 бит сегментную компоненту, дописывая справа 4 нулевых бита, получаем число 12340h;
- расширяем до 20 бит компоненту смещения, дописывая слева 4 нулевых бита, получаем число 00123h;
- для получения физического адреса складываем полученные числа: 12340h + 00123h = 12453h.
Для процессора 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. Задавая произвольные значения сегментной компоненты и компоненты смещения любая программа может адресоваться к любому участку памяти компьютера. В частности, любая программа может преднамеренно или из-за ошибки разрушить области данных, принадлежащие операционной системе. Выделим два основных недостатка схемы адресации памяти реального режима:
- ограниченное адресное пространство (до 1 мегабайта плюс примерно 64 килобайта старшей области памяти для процессоров i80286, i80386 и i80486);
- свободный доступ для любых программ к любым областям данных, что представляет потенциальную опасность для целостности операционной системы.