Какая память используется для хранения вектора сброса?
Из википедии: Вектор сброса для процессора 8086 находится по адресу FFFF0h. Где хранится вектор сброса?
1 ответ
Адрес вектора сброса - в данном случае FFFF0h - ЦП фиксируется аппаратно по конструкции. Это часть спецификации процессора. Процессор переходит по этому адресу, выбирает любой найденный адрес, переходит на этот адрес и начинает выполнение. Это своего рода двойное косвенное обращение с фиксированным первым шагом (процессор переходит по адресу FFFF0h, который, скорее всего, находится в каком-либо ПЗУ) и вторым шагом, который зависит от машины. На ПК вектор будет указывать на код ранней инициализации в BIOS, который начинает процесс загрузки, но в целом это может быть в принципе все, что может быть связано с аппаратной памятью по этому адресу, но в 99,9% случаев это какой-то ROM (PROM, EPROM, EEPROM и т. д.).
Например, предположим, что спецификации проекта для ЦП с 32-разрядным адресным пространством таковы, что вектор холодной загрузки (включения питания) равен 0xffff4, вектор сброса равен 0xffff0, и предполагается, что нижние 1 МБ (от 0x00000 до 0xfffff)) зарезервирован для загрузочного кода ПЗУ. Предположим, что вы покупаете плату с разъемом для ПЗУ объемом 1 МБ, которое сопоставлено с этим адресным пространством.
Затем вы пишете ПЗУ BIOS для этой машины, скажем, около половины мегабайта, и в результате возиться с компилятором и ассемблером вы получаете файл объектного кода, где находится самый первый код, который вы хотите использовать. запуск при включении питания смещается в файл 0x1230 байт, где вы выполняете небольшую базовую настройку, а затем переходит к смещению 0x3210 в файле, где код подходит для запуска с "горячей" загрузки или сброса. В этом случае вы добавили бы файл объектного кода в 1 МБ, убедитесь, что значение 0x00003210 имеет смещение 0x000ffff0, а значение 0x00001230 - смещение 0x000ffff4.
Вы записываете файл на совместимое ПЗУ, начиная с адреса 0x0, чтобы смещения файла транслировались непосредственно в адреса в диапазоне от 0x00000000 до 0x000fffff. Когда машина включена, она сразу переходит по адресу 0x000ffff4, находит там значение 0x00001230, загружает это значение в указатель инструкций (или в счетчик программы, как вы хотите его вызвать) и начинает выполняться по адресу 0x00001230, где находится ваш код холодной загрузки. является.
Процессор знает, был ли он сброшен или полностью выключен, а затем снова включен. Если ЦП сбрасывается (например, из-за тройного сбоя), то вместо перехода к адресу 0x000ffff4 он переходит к своему вектору сброса по адресу 0x000ffff0, загружает значение 0x00003210 и начинает его выполнять. Это, по сути, то, как компьютер может пропустить POST при перезагрузке, но не при выключении и повторном включении. У него разные векторы в зависимости от того, холодный он или теплый.
В действительности современные процессоры почти наверняка выполняют множество микрокодов внутри, прежде чем подойти к адресам и шинам данных, чтобы получить векторы сброса или загрузки. Весьма вероятно, что этот микрокод может быть загружен в ЦП, но это не меняет основную идею на архитектурном уровне, и "векторизация", подобная этой, является очень и очень старой практикой, которая возникает из-за повсеместного распространения (на ЦВП без использования векторов).) адреса сброса, содержащего инструкции, эквивалентные "переходу по адресу 0x01230", эффективно выполняющие "векторизацию" вручную.
Вектор сброса сохраняется вместе с прошивкой во флэш-памяти. Вектор сброса встроен в прошивку и находится на ее конце. Из слайда 15 Advanced x86: Introduction to BIOS & SMM Internals - Reset Vector:
- Если сбросить BIOS и посмотреть его в шестнадцатеричном редакторе, в конце файла мы увидим инструкцию перехода (рядом, относительный переход)
- Чипсет выравнивает флэш-память так, чтобы предел области BIOS (всегда единственная / последняя область на флэш-памяти) совпадал с адресом FFFF_FFF0h
В EDK2, вы можете увидеть код ассемблера для сброса вектора здесь.