Как процессор читает B IOS из SPI fla sh? - PullRequest
0 голосов
/ 13 февраля 2020

Типичные системы x86 имеют встроенное программное обеспечение (также известное как B IOS или UEFI), хранящееся в чипе Fla sh на основе SPI. Когда происходит включение питания, процессор начинает выполнение с вектора сброса, который указывает на отображенный в памяти чип SPI, где хранится B IOS. С этого момента начальная загрузка происходит, когда B IOS завершает инициализацию платформы, загружает загрузчик, который затем загружает ядро.

Однако, как процессор узнает, как читать с чипа SPI? Я имею в виду, что в этот момент процессор не будет знать о протоколе SPI, какие регистры чипа для записи команды и какой регистр для поиска прочитанных данных. Как происходит чтение на таком низком уровне?

1 Ответ

7 голосов
/ 13 февраля 2020

Первое, что делает процессор Haswell + при включении питания (после BIST - встроенного самотестирования), выполняет процедуру микрокодирования, часть технологии Intel TXT , для извлечения FIT в 4GiB-40h и выполняет B IOS ACM (модуль аутентифицированного кода) и, в конечном итоге, продолжает измеренную загрузку или откат к устаревшему вектору сброса в 4GiB - 10h.

В любом случае, ЦПУ необходимо извлечь инструкции из окна памяти на несколько МБ чуть ниже 4 ГБ.
ЦП не имеет интерфейса SPI, запросы к этому окну всегда перенаправляются на интерфейс DMI, из соображений безопасности .
Вы можете найти следующую карту в Главе 2.6 таблицы 8-9-го поколения Vol. 2 (верно даже в предыдущих поколениях, AFAIK):

Memory map

, что имеет отношение к этому пункту:

Из соображений безопасности процессор положительно декодирует этот диапазон [High BIOS] в DMI. Это положительное декодирование гарантирует, что любые перекрывающиеся диапазоны будут игнорироваться. Это гарантирует, что вектор загрузки и B IOS выполняются с PCH.

Таким образом, CPU загружается с интерфейса DMI и, следовательно, обрабатывает PCH (концентратор контроллера платформы) запросы.
Обратите внимание, что даже в более старых системах, где это окно размером около 4 ГБ было субтрактивно декодировано для интерфейса DMI (т. е. отправлялось на интерфейс DMI, только если ни одно другое устройство не требовало этого), загрузка почти всегда осуществлялась из DMI. сам интерфейс.
Новое положительно декодированное поведение является мерой защиты от загрузочных атак.

Если вы посмотрите на таблицу данных относительно современного PCH, то есть series 200 , вы увидите, что он поддерживает ПЗУ Fla sh за мостом LP C или SPI интерфейсы.

Мы ограничимся последним.
В этом чипсете мостом SPI является устройство 31 PCI, функция 15.
В своем пространстве конфигурации PCI есть стандартные регистры и:

  • BAR (регистр базового адреса) для отображения окна 4 Мбайт в регистре MMIO для управления самим интерфейсом SPI.
  • A B IOS Включение декодирования регистрация этого разрешает или запрещает восстановление доступа к памяти в параметрах c windows.
  • Регистр управления для включения различных функций безопасности (в том числе при загрузке с интерфейса SPI или LP C).

Давайте сосредоточимся на втором пункте:

BIOS Decode Enable Register

Две вещи, на которые следует обратить внимание: сначала этот регистр включает или отключает отправку обращений к памяти из ЦП, в области 4 МБ ниже 4 ГБ и других, в SPI.
Во-вторых, значение по умолчанию 0ffcfh, означает, что по умолчанию все windows сопоставлены с SPI .
B IOS Регистр управления также выбирает SPI в качестве загрузочного интерфейса по умолчанию, но его также можно настроить с помощью пинов softtstrap / bootstrap, IIR C.

И последнее, но не менее важное: когда PCH видит доступ к адресу, подобному 4GiB-10h, он не может отправить его как в ПЗУ Fla sh, так как он был бы вне диапазона для Fla sh Сам ПЗУ.
Сначала он должен его декодировать, вычитая смещение. Однако это смещение зависит от размера ПЗУ Fla sh.

До PCH (я думаю о чипсете ICH8 и в некоторых не слишком новых чипсетах Atom) использовалось ПЗУ Fla sh без дескрипторов .
Чипсет просто сопоставил ROM от 4GiB до 4GiB-16MiB с псевдонимом, что означает, что адрес 4GiB - X будет сопоставлен с Fla sh Размер - (X% Fla sh размер) .
В результате, например, карта 8 МБ sh в 2 МБ отображалась 8 раз в 16 МБ windows ниже предела 4 ГБ.
В этих чипсетах были bootstrap пинов для настройки размера Fla sh.

Today Fla sh ROM для PCH используют дескрипторы , где fla sh делится на области (B IOS, ME, GbE и др. * 1119 . *).
Только область B IOS отображается в адресном пространстве CPU. Существует система дескрипторов безопасности, основанная на идентификаторе запрашивающей стороны (заданном его идентификатором PCI).
Для ознакомления с этой версией c см. это или лучше это для более полного описания (немного устаревшего, но все еще актуального).
Здесь релевантные регионы, потому что они перечислены в дескрипторе Fla sh с их смещением и размером, поэтому PCH может знать, как переводить адреса CPU в линейные адреса Fla sh.

Наконец, регистры MMIO интерфейса SPI обеспечивают необработанный доступ к ПЗУ Fla sh. Можно синтезировать команды для отправки по шине SPI, что позволяет перепрограммировать ПЗУ Fla sh (например).
Они по-прежнему подвергаются различным мерам безопасности, которые должны быть перечислены в таблице данных, IIR C.

...