Реальный режим


Реальный режим (или режим реальных адресов; англ. real-address mode) — режим работы процессоров архитектуры x86, при котором используется сегментная адресация памяти (адрес ячейки памяти формируется из двух чисел: сдвинутого на 4 бита адреса начала сегмента и смещения ячейки от начала сегмента; любому процессу доступна вся память компьютера). Изначально режим не имел названия, был назван «реальным» только после создания процессоров 80286, поддерживающих режим, названный «защищённым» (режим назван «защищённым», так как создавался для «защиты» процессов друг от друга — для того, чтобы не позволить процессам иметь доступ к областям памяти друг друга; но для процессоров 80286 защищённый режим не был по настоящему «защищённым», так как эти процессоры не поддерживали страничную адресацию памяти, впервые реализованную в процессорах 80386).

Для вычисления физического или линейного адреса ячейки памяти процессор вычисляет физический адрес начала сегмента — умножает сегментную часть виртуального адреса на число 16 (или, что то же самое, сдвигает её влево на 4 бита), а затем складывает полученное число со смещением от начала сегмента:

Если сегментная часть адреса не указана (в коде инструкции), процессор читает сегментную часть адреса из одного из сегментных регистров (из какого именно — зависит от кода инструкции).

При такой адресации адреса 0400h:0001h и 0000h:4001h (буква «h» означает, что число записано в шестнадцатеричной системе счисления) будут ссылаться на одну и ту же ячейку памяти, так как 400h × 16 + 1 = 0 × 16 + 4001h.

Максимальный адрес: FFFFh:FFFFh (FFFFh × 16 + FFFFh) = 10FFEFh = 1 114 095 Б = 100000h + 10000h - 11h = МиБ + 64 КиБ - 17 Б).

Описанный способ вычисления физического адреса позволяет адресовать (1 МиБ + 64 КиБ - 17 Б + 1 Б) памяти (диапазон адресов 0000h…10FFEFh); 1 байт добавляется для учёта байта с нулевым адресом. Однако в процессорах 8086/8088 имеется всего 20 адресных линий (металлических дорожек), поэтому размер доступной памяти составляет 220 Б = 1 МиБ (диапазон адресов 0000h…FFFFFh), а при адресации выше (в диапазоне 100000h…10FFEFh) происходит переполнение («заворот») — старший единичный бит адреса игнорируется, и происходит обращение к 64 КиБ в начальных адресах (0000h…FFEFh).