Использование сегментов и смещений - PullRequest
0 голосов
/ 29 февраля 2020

Вначале объем памяти был небольшим (64 КиБ), и для его решения требовался только 16-битный регистр. Но позже пришла память с 1 МиБ. Поэтому нам нужны большие адресные регистры. Но в 8086 процессорах вместо этого они использовали другой регистр и назвали его смещением.

Таким образом, с 16-разрядным основным регистром мы можем адресовать 65536 сегментов, а с 16-разрядным смещением мы можем адресовать 65536 байтов в этих сегментах, так что вся память адрес, который мы можем адресовать, должен быть 65536 * 65536, это означает, что мы можем адресовать 4 ГиБ.

Но на 8086 мы можем адресовать 1 МБ с 32-битным дальним указателем (16-битный сегмент + 16-битное смещение). Почему это?

1 Ответ

2 голосов
/ 29 февраля 2020

Как уже упоминалось в комментариях Нейта Элдриджа, сегменты перекрываются. Каждый последующий 86-сегментный режим начинается на 16 байт после предыдущего. Поэтому (как уже упоминалось) существует 4096 (4 Ки) способов адресации любого байта.

Исключение составляет обработка A20 на более поздних процессорах x86. На тех, если A20 включен, память в первых 64 КиБ имеет меньше псевдонимов, указывающих на это. Адрес, который «обернет» на 8086, начиная с 0FFFFh:0010h, указывал бы на первые 64 КиБ (начиная с линейного адреса 00_0000h).

Если A20 включен, старшие адреса делают больше не «переносить», так что 0FFFFh:0010h фактически ссылается на линейный адрес 10_0000h (ровно на 1 МБ = 1_048_576 байт). Наибольший доступный адрес в режиме Real или Virtual 86 с включенным A20 составляет 0FFFFh:0FFFFh, что указывает на линейный 10_FFEFh (чуть ниже 1088 КиБ - 16 байт), то есть 1_114_096 байт адресуется с использованием дальнего адреса 16:16.

...