Реальный режим
(или режим реальных адресов;
англ.
real-address mode
) ? режим работы
процессоров
архитектуры
x86
, при котором используется
сегментная
адресация памяти
(адрес ячейки
памяти
формируется из двух чисел: сдвинутого на
4 бита
адреса начала сегмента и смещения ячейки от начала сегмента; любому
процессу
доступна вся память компьютера). Изначально режим не имел названия, был назван ≪реальным≫ только после создания процессоров
80286
, поддерживающих режим, названный ≪
защищённым
≫ (режим назван ≪защищённым≫, так как создавался для ≪защиты≫ процессов друг от друга ? для того, чтобы не позволить процессам иметь доступ к областям памяти друг друга; но для процессоров 80286 защищённый режим не был по настоящему ≪защищённым≫, так как эти процессоры не поддерживали
страничную
адресацию памяти
, впервые реализованную в процессорах
80386
).
В реальном режиме виртуальный адрес ячейки памяти состоит из двух чисел:
- сегментной части разрядностью
16
бит
, по которой вычисляется физический адрес начала сегмента;
- смещения разрядностью
16 бит
ячейки памяти от начала сегмента.
Для вычисления физического или линейного адреса ячейки памяти процессор вычисляет физический адрес начала сегмента ? умножает сегментную часть виртуального адреса на число 16 (или, что то же самое,
сдвигает
её влево на
4 бита
), а затем складывает полученное число со смещением от начала сегмента:
- сегментная_часть × 16 + смещение
Если сегментная часть адреса не указана (в коде
инструкции
), процессор читает сегментную часть адреса из одного из сегментных
регистров
(из какого именно ? зависит от кода инструкции).
При такой адресации адреса
0400
h
:0001h
и
0000h:4001h
(буква ≪h≫ означает, что число записано в
шестнадцатеричной системе счисления
) будут ссылаться на одну и ту же ячейку памяти, так как
400h × 16 + 1 = 0 × 16 + 4001h
.
Минимальный адрес:
0000h:0000h
(
0 байт
).
Максимальный адрес:
FFFFh:FFFFh
(
FFFFh × 16 + FFFFh) =
10FFEFh = 1 114 095
Б
=
100000h + 10000h - 11h =
1
Ми
Б
+ 64
Ки
Б
- 17 Б
).
Описанный способ вычисления физического адреса позволяет адресовать (
1 МиБ + 64 КиБ - 17 Б + 1 Б
) памяти (диапазон адресов
0000h…10FFEFh
);
1 байт
добавляется для учёта байта с нулевым адресом. Однако в процессорах
8086
/
8088
имеется всего 20 адресных линий (металлических дорожек), поэтому размер доступной памяти составляет
2
20
Б = 1 МиБ
(диапазон адресов
0000h…FFFFFh
), а при адресации выше (в диапазоне
100000h…10FFEFh
) происходит переполнение (≪заворот≫) ? старший единичный бит адреса игнорируется, и происходит обращение к
64 КиБ
в начальных адресах (
0000h…FFEFh
).
Процессоры
80286
имеют 24?битовую
адресную шину
(возможна адресация
2
24
Б = 16 МиБ
памяти), поэтому в них переполнения (≪заворот≫) не происходит.
Компьютеры
IBM PC/AT
построены на процессоре
Intel 80286
, и для сохранения совместимости с компьютерами
IBM PC
и
IBM PC/XT
(построенными на Intel 808x) оснащены логическим элементом (
вентилем
), управляющим работой 21?го адресной линии (провода) (обозначаемой ≪A20≫) и названным ≪Gate A20≫. Этот логический элемент по умолчанию отключен (что соответствует режиму совместимости), и управляется через
контроллер клавиатуры
(обычно, через микросхему
Intel 8042
).
После включения питания компьютера или после подачи на процессор сигнала сброса
процессор
архитектуры
x86
начинает работу в реальном режиме. В этом режиме начинается исполнение кода
BIOS
IBM-PC-совместимого компьютера
. В реальном режиме может быть выполнена инициализация некоторой аппаратуры (например, инициализация контроллера
ОЗУ
чипсета
), необходимая для работы программ после переключения процессора в
защищённый режим
. Если размеры кода и данных программы, выполняющей инициализацию аппаратуры, невелики, эта программа может выполняться в реальном режиме. Так, например,
DOS
работает в реальном режиме и не пытается перевести процессор в защищённый режим. Ранние версии ОС
Microsoft Windows
могли работать только в реальном режиме. Даже ОС
Windows 3.0
среди трёх режимов работы предусматривала запуск в реальном режиме и могла выполняться на процессоре 8086.
Процессоры 80286 и более новые модели, работая в реальном режиме, в основном, имеют такие же ограничения на размер
адресного пространства
, как и процессоры 8086. Для использования памяти большего размера программам, разработанным для реального режима, необходимы специальные программные средства. На машинах с процессором 80286 и более новыми моделями, можно, например, использовать драйверы вроде
HIMEM.SYS
. Существуют также средства, предоставляемые
недокументированной
командой
LOADALL
(что, однако, сопряжено с рядом трудностей). В процессорах 80386 и более новых моделях появилась возможность, не документированная фирмой Intel и позволяющая перевести процессор в режим, неофициально названный режимом ≪
unreal
≫. Работая в режиме unreal, программа может, хоть и с некоторыми ограничениями, использовать 32?битовое физическое
адресное пространство
(
2
32
Б = 4 ГиБ
).
Несмотря на то, что фирма Intel не предусмотрела возможность перехода процессора 80286 из защищённого режима в реальный режим, компьютер
IBM PC/AT
имеет такую возможность благодаря аппаратным особенностям и поддержке со стороны
BIOS
. Компьютер
IBM PC/AT
позволяет программам подавать сигнал сброса на процессор. Код BIOS может различать причины/режимы перезапуска, анализируя содержимое ячейки энергонезависимой памяти
CMOS
с адресом
0Fh
и ячейки
ОЗУ
с адресом
40h:72h
. Любая программа, записав в названные ячейки памяти подходящие значения и подав сигнал сброса на процессор, может заставить процессор перезагрузиться; после перезагрузки процессор начнёт исполнять код BIOS; код BIOS прочитает значения из вышеназванных ячеек памяти, не станет выполнять начальную загрузку, не станет изменять содержимое ОЗУ (в ОЗУ останутся те же данные, что и до перезагрузки процессора), и передаст управление коду, расположенному в ОЗУ по адресу, записанному в ячейку ОЗУ с адресом
40h:67h
. Таким образом программа может многократно переключаться между защищённым и реальным режимами, хотя этот способ требует сравнительно большого расхода времени на каждое переключение.
Возможность ≪нормального≫ (без ухищрений) программного перехода из защищённого режима в реальный режим была предусмотрена фирмой Intel только в процессорах 80386 и в более новых моделях. Однако в 80386 большую ценность имеет другая новая возможность ?
режим виртуального 8086
(V86, VM86). В режиме V86 программы могут использовать как бы прежний (сегментный) способ адресации памяти процессора 8086; при этом процессор будет находится в защищённом режиме, а физический (линейный) адрес, вычисленный по правилам 8086, будет подвергаться страничной трансляции. Благодаря режиму V86 появилась возможность создания
виртуальных машин
. Операционная система может ограничить доступ к той или иной области памяти (см.
защита памяти
) для каждой виртуальной машины, может выделять для них
виртуальную память
вместо реальной (физической) и может контролировать обращения к
портам ввода-вывода
. Перечисленное используется для организации работы ОС DOS под управлением
многозадачных
ОС
вроде
OS/2
и Microsoft Windows. При этом каждой виртуальной машине DOS доступен только
1 МиБ
адресного пространства
, и одновременно могут быть запущены несколько виртуальных машин DOS.
Адресное пространство
IBM-PC-совместимого компьютера
в реальном режиме делится на четыре части:
Область памяти, называемая ≪
основной
≫ (
англ.
conventional memory
), используется для хранения
таблицы векторов прерываний
и различных данных
BIOS
, расположена в ОЗУ начиная с адреса
0000h:0000h
, занимает
640 КиБ
и может использоваться 16-битовыми
программами
ОС
DOS
.
Область памяти, называемая ≪верхней≫ или ≪
upper
≫ (
англ.
upper memory area
,
UMA
), занимает
384 КиБ
, используется для размещения информации об
аппаратной части компьютера
, условно делится на три области размером по
128 КиБ
каждая. Первая область служит для хранения
видеопамяти
. Через вторую область доступны
BIOS
адаптеры. Третья область используется кодом BIOS, но, как правило, не полностью (обычно остаётся
64 КиБ
). Остальное адресное пространство из верхней области с помощью специальных драйверов (например,
EMM386.EXE
, EMS.EXE, LIMEMS.EXE и т. п.) и/или устройств расширения может использоваться для доступа к
расширенной (expanded) памяти
согласно её спецификации (
англ.
expanded memory specification
,
EMS
).
Область памяти, называемая ≪
high
≫ (
англ.
high memory area
,
HMA
) располагается сразу за первым мебибайтом и занимает
64 КиБ
минус
16 байт
. Её появление обусловлено особенностью процессора
80286
, в котором имеется 24 линии адреса, и при обращении по адресам выше
FFFFh:000Fh
обращение идёт ко второму мебибайту памяти (вместо начала первого мебибайта, как в
8086
/
8088
). Является подмножеством ≪дополнительной≫ (англ. extended) памяти.
Область памяти, называемая ≪
дополнительной
≫ (англ.
extended
) доступна для 16-битовых программам согласно её спецификации (
англ.
e
x
tended memory specification
,
XMS
), начинается с адресов, расположенных выше первого мебибайта, и имеет размер, зависимый от размера установленной на компьютере оперативной памяти.