Реальный режим
Реальный режим (или режим реальных адресов; англ. real-address mode) — режим работы процессоров архитектуры x86, при котором используется сегментная адресация памяти (адрес ячейки памяти формируется из двух чисел: сдвинутого на 4 бита адреса начала сегмента и смещения ячейки от начала сегмента; любому процессу доступна вся память компьютера). Изначально режим не имел названия, был назван «реальным» только после создания процессоров 80286, поддерживающих режим, названный «защищённым» (режим назван «защищённым», так как создавался для «защиты» процессов друг от друга — для того, чтобы не позволить процессам иметь доступ к областям памяти друг друга; но для процессоров 80286 защищённый режим не был по настоящему «защищённым», так как эти процессоры не поддерживали страничную адресацию памяти, впервые реализованную в процессорах 80386).
Описание
В реальном режиме виртуальный адрес ячейки памяти состоит из двух чисел:
- сегментной части разрядностью 16 бит, по которой вычисляется физический адрес начала сегмента;
- смещения разрядностью 16 бит ячейки памяти от начала сегмента.
Для вычисления физического или линейного адреса ячейки памяти процессор вычисляет физический адрес начала сегмента — умножает сегментную часть виртуального адреса на число 16 (или, что то же самое, сдвигает её влево на 4 бита), а затем складывает полученное число со смещением от начала сегмента:
- сегментная_часть × 16 + смещение
Если сегментная часть адреса не указана (в коде инструкции), процессор читает сегментную часть адреса из одного из сегментных регистров (из какого именно — зависит от кода инструкции).
При такой адресации адреса 0400h: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 адресных линий (металлических дорожек), поэтому размер доступной памяти составляет 220 Б = 1 МиБ (диапазон адресов 0000h…FFFFFh), а при адресации выше (в диапазоне 100000h…10FFEFh) происходит переполнение («заворот») — старший единичный бит адреса игнорируется, и происходит обращение к 64 КиБ в начальных адресах (0000h…FFEFh).
Процессоры 80286 имеют 24‑битовую адресную шину (возможна адресация 224 Б = 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‑битовое физическое адресное пространство (232 Б = 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 (основная область памяти);
- upper memory area (верхняя память);
- high memory area;
- extended memory (дополнительная область памяти);
Область памяти, называемая «основной» (англ. 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-битовых программам согласно её спецификации (англ. extended memory specification, XMS), начинается с адресов, расположенных выше первого мебибайта, и имеет размер, зависимый от размера установленной на компьютере оперативной памяти.
Путаницы в названиях
- Слова high и upper переводятся на русский одинаково как «верхний», поэтому в русскоязычной литературе может возникать путаница при переводе названий данных областей памяти.
- Слова extended и expanded переводятся на русский как «расширенный». При этом extended memory (дополнительная область памяти) — область памяти за пределами первого мегабайта, а expanded memory (расширенная память) — способ адресации памяти за пределами «основной» (conventional memory) области памяти для DOS программ.
См. также
- Адресация памяти
- Режимы: защищённый, unreal.