8086 Сбросить вектор выше 20 бит с шинами 20 бит - PullRequest
0 голосов
/ 25 марта 2019

Как процессор может получить инструкции с адреса 0xfffffff0 (CS_base : 0xffff0000 + IP : 0xfff0), если он превышает ограничение в 1 МБ 20-битной шины?

  • Я понимаю, что регистр cs начинается сбазовый адрес 0xffff0000
  • Но я не понимаю, как шина может связать этот адрес только с 20-битной шиной

Я прочитал другие посты;они говорят только о том, что регистр cs имеет аппаратную связь для получения базового адреса 0xffff0000, а не об ограничении шины

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Первоначально (например, для 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.

1 голос
/ 25 марта 2019

8086 имеет 20-битную шину, и при сбросе регистр CS устанавливается в 0xffff, а IP - в 0x0000, что делает физический адрес 0xffff0 или 20-битным. Процессоры с 20-разрядным адресным пространством имеют 16-разрядные регистры CS и IP, и поэтому значения регистров, которые у вас есть в вашем вопросе (CS: 0xffff0000 + EP: 0xfff0), являются неправильными для 8086 CPU.

...