Реальный режим - это режим, в котором работал первый процессор семейства x86 - 8086. Все последующие модели микропроцессоров поддерживают этот режим для совместимости со старым программным обеспечением. Поскольку 8086 был 16-разрядным процессором, адресующим не более 1 Мб адресного пространства, то и современные процессоры в реальном режиме также имеют разрядность 16 бит и адресное пространство в 1Мб. Однако, в отличие от 8086, современные процессоры в реальном режиме могут задействовать некоторые дополнительные возможности, например новые регистры, новые команды и т.п.

Регистры

В реальном режиме процессор может использовать все сегментные регистры и регистры общего назначения, которые были у процессора 8086. Кроме того 32-разрядные процессоры могут пользоваться "расширенными версиями" регистров общего назначения - EAX, EBX, ECX, EDX. Также стали доступны два новых сегментных регистра - FS и GS. Процессоры, поддерживающие расширения MMX, SSE и SSE2 могут использовать и дополнительные регистры, предоставляемые этими технологиями.

Организация адресного пространства

Поскольку процессор 8086 был 16-разрядным и не мог напрямую адресовать весь мегабайт доступной памяти (для этого требуется 20-битный адрес), разработчикам для адресации пришлось применить сегментную модель памяти. Размер сегмента сделали 65536 байт, что позволило полностью его адресовать с помощью 16-разрядного смещения. Адреса сегментов сделали кратными 16 байтам, что позволило отбросить младшие 4 бита, а старшие 16 бит записать в специальный сегментный регистр и использовать его для обращения к памяти. Таким образом для получения 20-битного адреса процессор умножает адрес сегмента на 16 и прибавляет к нему смещение:


Формирование физического адреса
 

Адресация в реальном режиме современных процессоров практически не отличается от адресации процессора 8086. Единственным отличием является возможность дополнительно адресовать 65540 байт памяти выше 1 мегабайта. Эта возможность появилась вследствие ошибки разработчиков при создании новых моделей процессоров. Дело в том, что если в сегментный регистр записать значение 0FFFFh (что соответствует последнему доступному сегменту памяти), а смещение, например, задать равным 0FFFFh, то физический адрес ячейки памяти получится равным 10FFEFh. В процессоре 8086 была 20-битная адресная шина, поэтому такой адрес аппаратно обрезался до 0FFEFh. В современных процессорах адресная шина имеет больше 20 разрядов, поэтому адрес не обрезается и получается адресовать дополнительно чуть менее 64 Кб основной памяти. Однако во всех новых процессорах существует возможность блокировки 21 разряда адресной шины, что позволяет полностью имитировать режим работы процессора 8086.

Прерывания

Обработка прерываний в реальном режиме организована следующим образом. Все адреса обработчиков прерываний собраны в одну таблицу, расположенную по адресу 00000h и занимающую 1 Кб памяти. Каждая ячейка этой таблицы представляет собой два 16-битных слова: адрес сегмента и смещение в сегменте, причем первым расположено смещение, а за ним адрес сегмента.


Таблица прерываний