Как ПЗУ BIOS отображается в адресное пространство на ПК? - PullRequest
11 голосов
/ 18 октября 2011

Процессор x86 начинает выполнение с физического адреса 0xFFFFFFF0. Там в конце адресного пространства находится ПЗУ BIOS. Первая инструкция, которую ЦПУ выполняет из ПЗУ, представляет собой дальний переход, который приводит к перезагрузке сегмента CS, поэтому следующая команда выполняется изнутри физической области 0x000F0000 - 0x000FFFFF.

Что заставляет ПЗУ реагировать на оба региона? Есть ли какая-то особая логика декодирования адресов на ПК? Я нашел комментарий в исходном коде Bochs, в котором говорится, что последние 128 КБ ПЗУ BIOS сопоставлены с 0xE0000 - 0xFFFFF. Однако я не могу найти больше информации об этом. Понятно, что это специфично для ПК, поскольку у меня есть встроенная плата x86, и такого зеркалирования там не бывает. Я могу использовать только ближний прыжок.

1 Ответ

15 голосов
/ 18 октября 2011

На ПК всегда присутствует некоторая логика декодирования адресов, потому что в физическом адресном пространстве есть несколько «дыр / окон», через которые вместо ПЗУ доступны ПЗУ BIOS и устройства ввода-вывода (например, видеокарта).Это сделано по соображениям совместимости, поэтому старые программы могут по-прежнему выполняться на более новых компьютерах.

Что касается начального адреса, с которого ЦП начинает выполнение после сброса, если вы посмотрите документацию, вы увидите, чтоПроцессоры Pentium класса начинаются с этого:
EIP = 0xFFF0
CS.Selector = 0xF000
CS.Base = 0xFFFF0000

Если вы следуете обычной схеме адресации реального режима, физический адресдолжен быть CS.Selector * 16 + IP или, с подставленными значениями, 0xFFFF0.Однако ЦП фактически рассчитывает адрес с использованием CS.Base + (E) IP (в реальном и 16/32-битном защищенном режиме, но не в виртуальном 8086 или 64-битном защищенном режиме), следовательно, первый адрес, который запрашивает ЦПиз памяти будет 0xFFFFFFF0.Ваша неспособность использовать дальний переход к коду в ПЗУ по этому высокому адресу может быть связана с тем, что загрузка в CS приведет к сбросу CS.Base до 16 * нового значения CS.Selector.Итак, переход к, скажем, 0xF000: 0xFFF0 передаст управление в 0xFFFF0 вместо 0xFFFFFFF0, и если ПЗУ также не отображается в этом низком месте в памяти, а код в нем не подходит для работы с CS (.Selector) = 0xF000,он не будет работать.

Кроме того, ни ЦП, ни схемы вокруг него не должны поддерживать все 32 (или более) адресных линий, если ПК ограничен максимум 16 МБ (как это было на i80286 иi80386SX) или 4 ГБ (как это было на i80386DX / оригинальном i80386 и i80486) или 2 40-52 байтов (на 64-битных процессорах класса Pentium) и, если это так, если число старшихбиты в физическом адресном пространстве игнорируются, можно сказать, что выполнение эффективно начинается с адреса ниже теоретического максимума - 16, например, 0x00FFFFF0 (i80286 / i80386SX).

Если вам нужно решить проблемы с вашей платойсм. его документацию и схемы, чтобы узнать, как ПЗУ отображается в физическое адресное пространство на нем.

...