Реальный режим (real mode) — это режим, в который переходит процессор после включения или перезагрузки. Он реализует среду программирования процессора Intel 8086 с возможностью расширения (например, перехода в защищенный режим или режим системного управления). Это стандартный 16-разрядный режим, в котором доступно только 1 Мб физической памяти. Иногда этот режим называют режимом реальных адресов (real-address mode), потому что в нем нельзя активировать механизм трансляции виртуальных адресов в физические. Это значит, что все адреса, к которым обращаются программы, являются физическими, т. е. без какого-либо преобразования будут выставлены на шину адреса. В этом режиме «родной» для процессора размер равен 2 байтам, или слову (WORD).
Реальный режим характеризуется 20-битным сегментированным адресным пространством памяти (что и дает ровно 1 МБ адресуемой памяти) и неограниченным прямым программным доступом ко всей адресуемой памяти, адресам ввода-вывода и периферийному оборудованию. В реальном режиме не поддерживается защита памяти, многозадачность или уровни привилегий кода.
До выпуска 80286, в котором добавился защищенный режим, реальный режим был единственным доступным режимом для процессоров x86. Для обратной совместимости все процессоры x86 запускаются в реальном режиме при сбросе, хотя при запуске в других режимах можно эмулировать реальный режим в других системах.
Текущие процессоры x86 (включая x86-64) могут загружать операционные системы в реальном режиме и могут запускать программное обеспечение, написанное практически для любого предыдущего чипа x86, без эмуляции или виртуализации.
После включения питания компьютера или после подачи на процессор сигнала сброса процессор архитектуры x86 начинает работу в реальном режиме. В этом режиме начинается исполнение кода BIOS компьютера. BIOS работает в реальном режиме, как и операционные системы DOS. В реальном режиме может быть выполнена инициализация некоторой аппаратуры (например, инициализация контроллера ОЗУ чипсета), необходимая для работы программ после переключения процессора в защищённый режим. Если размеры кода и данных программы, выполняющей инициализацию аппаратуры, невелики, эта программа может выполняться в реальном режиме. Так, например, операционная система (ОС) DOS работает в реальном режиме и не пытается перевести процессор в защищённый режим. Ранние версии ОС Microsoft Windows могли работать только в реальном режиме. Даже ОС Windows 3.0 среди трёх режимов работы предусматривала запуск в реальном режиме и могла выполняться на процессоре 8086. На самом деле в Windows 3.0 было несколько режимов: «реальный режим», «стандартный режим» и «расширенный режим 386», последний требовал некоторых функций виртуализации процессора 80386 и, следовательно, не работал на 80286. В Windows 3.1 была удалена поддержка реального режима, и это была первая операционная среда, для которой требовался как минимум процессор 80286.64-битные операционные системы используют реальный режим только на этапе запуска, а ядро ОС переключит ЦП в длинный режим. Стоит отметить, что защищенный режим 80286 значительно более примитивен, чем улучшенный защищенный режим, представленный в 80386. Последний иногда называют защищенным режимом 386, и это режим, в котором работают современные 32-разрядные операционные системы x86.
Существует режим, называемый виртуальным режимом 8086 , который позволяет операционным системам, работающим в защищенном режиме, эмулировать сегментированную модель реального режима для отдельных приложений. Это можно использовать, чтобы позволить операционной системе защищенного режима по-прежнему иметь доступ, например, к функциям BIOS, когда это необходимо.
Программисты часто думают, что, поскольку реальный режим по умолчанию равен 16 битам, 32-битные регистры недоступны. Это неправда. Все 32-битные регистры (EAX, …) по-прежнему можно использовать, просто добавив «Префикс переопределения размера операнда» (0x66) в начало любой инструкции. Ваш ассемблер, скорее всего, сделает это за вас, если вы просто попытаетесь использовать 32-битный регистр.
В реальном режиме доступно чуть более 1 МБ адресуемой памяти (включая Область высокой памяти (High Memory Area)). См. Определение памяти (x86) и Карта памяти (x86), чтобы определить, сколько действительно можно использовать. Полезный объем будет намного меньше 1 МБ. Доступ к памяти осуществляется с помощью сегментации через систему сегмент:смещение.
Имеется шесть 16-битных сегментных регистров: CS, DS, ES, FS, GS и SS. При использовании сегментных регистров адреса задаются в следующих обозначениях (где «Сегмент» — это значение в сегментном регистре, а «Смещение» — это значение в адресном регистре):
12F3 : 4B27 ^ ^ Сегмент Смещение
Сегмент - часть адреса разрядностью 16 бит, по которой вычисляется физический адрес начала сегмента. Смещение - часть адреса разрядностью 16 бит определяет ячейку памяти от начала сегмента.
Сегменты и смещения связаны с физическими адресами уравнением:
Физический адрес = сегмент * 16 + смещение
Для вычисления физического или линейного адреса ячейки памяти процессор вычисляет физический адрес начала сегмента — умножает сегментную часть виртуального адреса на число 16 (или, что то же самое, сдвигает её влево на 4 бита), а затем складывает полученное число со смещением от начала сегмента.
Если сегментная часть адреса не указана (в коде инструкции), процессор читает сегментную часть адреса из одного из сегментных регистров (из какого именно — зависит от кода инструкции).
Например:
0002h : 0000h: 2h*16 + 0 = фактический адрес памяти 20h. 0001h : 0010h: 1h*16 + 10h = фактический адрес памяти 20h. Как видите, адреса памяти могут перекрываться. или 0400h:0001h: 400h*16 + 1 = фактический адрес памяти 4001h. 0000h:4001h: 0 × 16 + 4001h= фактический адрес памяти 4001h.
Минимальный адрес:
0000h:0000h (0 байт).
Максимальный адрес:
FFFFh:FFFFh (FFFFh × 16 + FFFFh) = 10FFEFh = 1 114 095 Б = 100000h + 10000h - 11h = 1 МиБ + 64 КиБ - 17 Б).
8086, 8088 и 80186 имеют 20-битную адресную шину, но необычная схема сегментированной адресации, которую Intel выбрала для этих процессоров, фактически дает эффективные адреса, которые могут иметь 21 значащий бит. Эта схема сдвигает 16-битный номер сегмента влево на четыре бита (составляя 20-битное число с четырьмя младшими нулями) перед добавлением к нему 16-битного смещения адреса; максимальная сумма возникает, когда и сегмент, и смещение равны 0xFFFF, что дает 0xFFFF0 + 0xFFFF = 0x10FFEF. На 8086, 8088 и 80186 результатом эффективного адреса, который переполняет 20 бит, является то, что адрес «зацикливается» на нулевой конец диапазона адресов, т. е. он берется по модулю 220 (220 = 1048576). = 0x100000). Однако 80286 имеет 24 бита адреса и вычисляет эффективные адреса до 24 бит даже в реальном режиме. Следовательно,для сегмента 0xFFFF и смещения больше 0x000F 80286 фактически сделает доступ к началу второгомегабайт памяти, тогда как 80186 и более ранние версии будут обращаться к адресу, равному [смещение]-0x10, который находится в начале первого мегабайта. (Обратите внимание, что в 80186 и более ранних версиях первый килобайт адресного пространства, начиная с адреса 0, является постоянным, неподвижным расположением таблицы векторов прерываний.) Таким образом, фактический объем памяти, адресуемый процессорами 80286 и более поздних версий x86. в реальном режиме 1 МБ + 64 КБ — 16 Б = 1 114 096 Б.