Введение

Реальный режим, также называемый режимом реальных адресов, является режимом работы всех x86-совместимых процессоров. Этот режим получил свое название из-за того, что адреса в реальном режиме всегда соответствуют физическим адресам в памяти. Реальный режим характеризуется 20-битным сегментированным адресным пространством (обеспечивающим 1 МБ адресуемой памяти) и неограниченным прямым программным доступом ко всей адресуемой памяти, адресам ввода-вывода и периферийным устройствам. Реальный режим не предоставляет поддержки защиты памяти, многозадачности или уровней привилегий кода. До появления защищенного режима с выпуском процессора 80286, реальный режим был единственным доступным режимом для процессоров x86. Для обеспечения обратной совместимости все процессоры x86 запускаются в реальном режиме после сброса, хотя эмуляция реального режима возможна и на других системах при загрузке в других режимах.

История

Архитектура 80286 ввела защищенный режим, обеспечивающий (в частности) аппаратную защиту памяти. Однако для использования этих новых возможностей требовалась новая операционная система, разработанная специально для защищенного режима. Поскольку одним из основных принципов проектирования микропроцессоров x86 является полная обратная совместимость с программным обеспечением, написанным для всех предыдущих чипов x86, чип 286 был спроектирован для запуска в "реальном режиме" – то есть в режиме, отключающем новые функции защиты памяти, чтобы обеспечить работу операционных систем, написанных для 8086 и 8088. По состоянию на 2018 год современные процессоры x86 (включая x86-64) способны загружать операционные системы в реальном режиме и запускать программное обеспечение, написанное практически для любого предыдущего чипа x86, без эмуляции или виртуализации. BIOS для ПК, представленный IBM, работает в реальном режиме, как и операционные системы DOS (MS DOS, DR DOS и т.д.). Ранние версии Microsoft Windows работали в реальном режиме. Windows/386 позволила частично использовать защищенный режим, что было более полно реализовано в Windows 3.0, которая могла работать либо в реальном режиме, либо использовать защищенный режим аналогично Windows/386. Windows 3.0 фактически имела несколько режимов: "реальный режим", "стандартный режим" и "улучшенный режим 386"; последний требовал некоторых функций виртуализации процессора 80386 и, следовательно, не работал на 80286. Windows 3.1 отказалась от поддержки реального режима и стала первой широко распространенной операционной средой, требовавшей как минимум процессор 80286. Ни одна из этих версий не может считаться современной x86 операционной системой, поскольку они переключались в защищенный режим только для определенных функций. Unix, Linux, OS/2, Windows NT считаются современными ОС, поскольку они переключают процессор в защищенный режим при загрузке, больше никогда не возвращаются в реальный режим и постоянно предоставляют все преимущества защищенного режима. 64-битные операционные системы используют реальный режим только на этапе загрузки, после чего ядро ОС переключает процессор в длинный режим. Важно отметить, что защищенный режим 80286 значительно более примитивен, чем улучшенный защищенный режим, представленный с 80386; последний иногда называют защищенным режимом 386, и именно в нем работают современные 32-битные x86 операционные системы.

Устранение проблем с пропускной способностью

8086, 8088 и 80186 имеют 20-битную адресную шину, но необычная сегментированная схема адресации, выбранная Intel для этих процессоров, фактически генерирует эффективные адреса, которые могут содержать 21 значащий бит. Эта схема сдвигает 16-битное число сегмента на четыре бита влево (создавая 20-битное число с четырьмя младшими битами, равными нулю), прежде чем добавить к нему 16-битное смещение адреса; максимальная сумма достигается, когда и сегмент, и смещение равны 0xFFFF, что дает 0xFFFF0 + 0xFFFF = 0x10FFEF. В процессорах 8086, 8088 и 80186, если результат эффективного адреса превышает 20 бит, адрес "переполняется" к началу диапазона адресов, то есть берется по модулю 2^20 (2^20 = 1048576 = 0x100000). Однако 80286 имеет 24 бита адреса и вычисляет эффективные адреса с точностью до 24 бит даже в реальном режиме. Следовательно, для сегмента 0xFFFF и смещения, большего чем 0x000F, 80286 фактически обратится к началу второго мегабайта памяти, в то время как 80186 и более ранние модели обратятся к адресу, равному [смещение] + 0x10, который находится в начале первого мегабайта. (Обратите внимание, что в 80186 и более ранних моделях первый килобайт адресного пространства, начиная с адреса 0, является постоянным и неизменяемым местоположением таблицы векторов прерываний.) Таким образом, фактический объем адресуемой памяти для 80286 и более поздних процессоров x86 в реальном режиме составляет 1 МБ + 64 КБ – 16 байт = 1 114 096 байт.

Линия А20

Некоторые программы, разработанные для процессоров, предшествовавших 80286, использовали особенности циклической (модульной) адресации памяти, поэтому 80286 создавал проблему обратной совместимости. Принудительное установление 21-й адресной линии (фактического логического сигнала, выходящего из чипа) в низкий логический уровень, представляющий ноль, обеспечивало эффект модуля 2^20, соответствующий адресной арифметике более ранних процессоров, но 80286 не имел встроенной возможности для выполнения этой функции. Когда IBM использовала 80286 в IBM PC/AT, они решили эту проблему, добавив программно-управляемый затвор для включения или отключения (принудительного обнуления) адресной линии A20 между выводом A20 на 80286 и системной шиной; это известно как Gate A20 (затвор A20), и он до сих пор реализован в чипсетах ПК. Большинство версий драйвера расширенной памяти HIMEM.SYS для IBM/MS-DOS при загрузке отображали сообщение об установке "обработчика A20" – программного компонента для управления Gate A20 и координации его работы с потребностями программ. В защищенном режиме линия A20 должна быть включена, иначе возникнут ошибки физической адресации, что, скорее всего, приведет к сбою системы. Современные устаревшие загрузчики (например, GNU GRUB) используют линию A20.

Переключение в реальный режим

Intel представила защищенный режим в семействе x86 с намерением, чтобы операционные системы, использующие его, работали полностью в новом режиме, и чтобы все программы, работающие под управлением операционной системы в защищенном режиме, также работали в защищенном режиме. Из-за существенных различий между реальным режимом и даже относительно ограниченным защищенным режимом 286, программы, написанные для реального режима, не могут работать в защищенном режиме без переписывания. Поэтому, учитывая широкую базу существующих приложений реального режима, от которых зависели пользователи, отказ от реального режима создавал проблемы для индустрии, и программисты искали способ переключаться между режимами по своему усмотрению. Однако Intel, последовательно придерживаясь своих намерений относительно использования процессора, предоставила простой способ переключения в защищенный режим на 80286, но не предоставила простого способа вернуться в реальный режим. До появления 386 единственным способом переключения из защищенного режима обратно в реальный режим был сброс процессора; после сброса он всегда запускается в реальном режиме для обеспечения совместимости с более ранними процессорами x86, начиная с 8086. Сброс процессора не стирает оперативную память системы, поэтому, хотя это и неудобно и неэффективно, это вполне осуществимо. Из защищенного режима состояние процессора сохраняется в памяти, затем процессор сбрасывается, перезапускается в реальном режиме и выполняет код реального режима для восстановления сохраненного состояния из памяти. Затем он может выполнять другой код реального режима, пока программа не будет готова вернуться в защищенный режим. Переключение в реальный режим требует значительных затрат времени, но эта техника позволяет программам защищенного режима использовать сервисы, такие как BIOS, который полностью работает в реальном режиме (изначально был разработан для модели IBM Personal Computer (тип машины) 5150 на базе 8088). Этот метод переключения режимов также используется DPMI (под реальным, а не эмулированным DOS) и DOS-расширителями, такими как DOS/4GW, чтобы позволить программам защищенного режима работать под DOS; система DPMI или DOS-расширитель переключается в реальный режим для вызова функций DOS или BIOS, а затем переключается обратно, чтобы вернуться к приложению, работающему в защищенном режиме.

Упадок

Переход к ядру NT означал, что операционной системе больше не требовался DOS для загрузки компьютера и она не могла его использовать. Потребность перезагружать компьютер в реальном режиме MS DOS уменьшилась после Windows 3.1x и прекратилась с выходом Windows ME. В настоящее время запустить DOS-приложения, требующие реального режима, в новых версиях Windows можно только с помощью эмуляторов, таких как DOSBox, или продуктов виртуализации x86.