Первоначально (например, для 8088, 8086, 80186) физические адреса были 20-разрядными (что давало 1 МБ физического адресного пространства).При включении питания и сбросе CS: IP был установлен на «0xF000: 0xFFF0 = 0xFFFF0», а ПЗУ встроенного программного обеспечения находилось в конце физического адресного пространства (например, заканчивается на физическом адресе 0xFFFFF).
Обратите внимание, что это значение не "выше 20 битов" из-за способа, которым "сегмент: смещение" был преобразован в физический адрес (в частности, "физический = сегмент * 16 + смещение").
Также обратите внимание, что для физических адресов, которые не помещаются в 20 битах, старший бит был отброшен, чтобы сделать его подходящим в 20 битах (например, «0xFFFF: 0xFFFE = 0xFFFF * 16 + 0xFFFE = 0x10FFEE = 0x0FFEE»).Это привело к специальной хакерской атаке («шлюз A20») для сохранения обратной совместимости путем отключения 21-й адресной строки (A20) при освобождении 80286 (а размер физического адреса был увеличен до 24 бит, что дает 16 МБ физического адресного пространства).
Другое изменение, которое произошло с 80286, заключается в том, что (для поддержки защищенного режима) регистры сегментов (которые изначально были просто 16-битными целыми числами) получили некоторые скрытые фрагменты - в первую очередь, в регистры сегментов было добавлено скрытое значение «базы сегментов»,так что (в защищенном режиме) у вас есть видимое значение, которое было загружено в регистр сегмента, а детали сегмента (базовый адрес, лимит) были загружены из таблицы (таблица глобальных дескрипторов или таблица локальных дескрипторов) и не подразумеваются напрямуюпо значению, загруженному в регистр сегмента, вычисление физического адреса было изменено для использования скрытого значения (например, «физического = сегмент.base + смещение»), а в реальном режиме база сегмента была установлена на нагрузках сегмента (например, «сегмент».база = значение * 16 ") такчто в реальном режиме все работает одинаково.
Позже (начиная с 80386) размер физического адресного пространства был увеличен (сначала до 32-разрядного, затем до 36-разрядного, затем до «архитектурного максимума 52»).биты ").Когда это произошло, они изменили значение, загруженное в скрытую часть CS при включении / сбросе.В частности, видимая часть осталась прежней (0xF000), но скрытая часть «сегмента базы» была установлена на 0xFFFF0000, так что она фактически становится «0xFFFF0000 + 0xFFF0 = 0xFFFFFFF0».Кроме того, ПЗУ встроенного программного обеспечения было смещено в конец 32-разрядного адресного пространства (например, заканчивается физическим адресом 0xFFFFFFFF);и (для совместимости) часть ПЗУ была скопирована (возможно, распакована) и помещена в ОЗУ по старому адресу (оканчивающемуся на физический адрес 0x000FFFFF), а контроллер памяти был настроен таким образом, что записи в «устаревшую область ПЗУ» игнорировались(так что он все еще вел себя как ROM, но был быстрее, потому что RAM был быстрее, чем ROM).
Конечно сейчас (для UEFI, в теории и / или когда «гибридный BIOS + UEFI» навсегда прекращает существовать, следующийгод) это может исчезнуть - нет необходимости копировать часть ПЗУ в «устаревшую область ПЗУ» и не нужно настраивать контроллер памяти, чтобы игнорировать записи в эту область;и мы могли бы просто иметь большую (3 ГиБ?) область нормальной используемой оперативной памяти от 0x00000000 до 0xBFFFFFFFF.