Различные способы запуска SMI для процессора

Я пишу некоторый код прошивки, работающий в режиме управления системой (SMM) на платформе Intel. Я хочу полностью понять, как запускается мой обработчик SMI.

Я прочитал из руководства Intel, что:

Единственный способ войти в SMM — подать сигнал SMI через контакт SMI# на процессоре или через сообщение SMI, полученное через шину APIC.

Я также читал, что синхронный SMI может быть запущен записью в порт ввода-вывода.

Мое понимание таково:

SMM — это просто особый режим работы процессора. Исходя из моего предыдущего опыта, всякий раз, когда я хочу изменить состояние процессора, например включить подкачку страниц или войти в защищенный режим, я обычно изменяю регистр управления< /strong> или Специфические для модели регистры (MSR). Эти регистры являются частью процессора, и я могу поверить, что если я изменю некоторые их биты, произойдет какая-то внутренняя магия.

Но что означает приведенный выше порт ввода-вывода? Куда указывает этот порт? Если запись в порт также может вызывать SMI, то как подход к записи порта связан с каноническими способами контакта SMI# и сообщения SMI ? И можно ли изменить этот номер порта?


person smwikipedia    schedule 13.06.2017    source источник
comment
ЦП входит в SMM после утверждения вывода SMI#. Это утверждение может быть виртуальным, посредством перепрограммирования конфигурации контактов LAPIC и последующим запуском подходящего прерывания, или физическим. Поскольку вывод по определению является внешним входом, ЦП требуется внешнее устройство для физического управления выводом SMI#. Обычно это ПЧ. PCH управляется через MMIO или выделенный ввод-вывод, последний принимает форму записи в адресное пространство ввода-вывода по определенному адресу.   -  person Margaret Bloom    schedule 13.06.2017
comment
В то время как адреса памяти идентифицируют ячейки памяти (также известные как слова), адреса ввода-вывода идентифицируют порты ввода-вывода. Это просто название, в конце концов, это все транзакции в шину DMI/QPI/DDR со своими данными, адресом и типом (memory vs io). Я не знаю ни одного стандартного порта ввода-вывода, который утверждает SMI #, у меня есть таблица данных Intel Chipset 200, в которой есть модуль PM, который может легко вызвать SMI, но это всего лишь конкретный случай. Каждый набор микросхем имеет свою структуру регистров, порты обычно идут непрерывными блоками, базовый адрес можно изменить, но нельзя изменить структуру.   -  person Margaret Bloom    schedule 13.06.2017
comment
Однако макет может быть стандартизирован. Что касается сообщения SMI: PCI/PCIe представила MSI (прерывание сигнализации сообщения) — это транзакции (они являются истинными записями по определенным адресам) на шине, которые IOAPIC или LAPIC отслеживают и преобразуют в прерывание. Использование транзакций вместо проводов дает огромные преимущества с точки зрения маршрутизации. Один из этих MSI может использоваться для запуска SMI, тем самым называя сообщение SMI.   -  person Margaret Bloom    schedule 13.06.2017
comment
Вы спрашиваете о стандартном способе запуска SMI через ввод-вывод или о том, как запись в порт может вызвать SMI? Первого не существует, второе можно превратить в ответ :)   -  person Margaret Bloom    schedule 13.06.2017
comment
Дело в том, что то, что Intel называет сообщением SMI в шине APIC, вероятно, является внутренним сообщением, используемым в устаревшей архитектуре APIC, которая использовала 3-проводную выделенную шину.   -  person Margaret Bloom    schedule 13.06.2017
comment
Спасибо! Я читаю код прошивки части PCH и смотрю, смогу ли я получить представление о всей истории SMI. Затем я вернусь с новыми выводами/вопросами. :)   -  person smwikipedia    schedule 13.06.2017
comment
Кажется, механизм прерывания претерпел такую ​​эволюцию: processor pins -> 8259A -> APIC -> MSI.   -  person smwikipedia    schedule 24.07.2017
comment
Контакты процессора @smwikipedia -> 8259A -> I/O APIC -> MSI -> MSI-x. IOAPIC имеет режим 8259A, и я думаю, что PCIe TLP могут эмулировать последовательность INTA. IOAPIC по-прежнему используется прерываниями RTC и ps2; это просто интерфейс для генерации прерываний MSI для устройств, которые его не поддерживают. Все устройства PCIe по-прежнему поддерживают маршрутизацию IOAPIC и используют раздел контактов в пространстве конфигурации для эмуляции пакета прерывания, который обрабатывается мостом.   -  person Lewis Kelsey    schedule 28.03.2019
comment
Хотя я не уверен в этом. Я уверен, что у PCI был тип транзакции, который позволял эмуляцию цикла 8086 INTA, но я не думаю, что PCIe это делает. Я думаю, что, возможно, APIC ввода-вывода имеет провода, которые напрямую подключаются к LINT0 и LINT1, когда он находится в режиме 8259A, но, поскольку APIC ввода-вывода был перемещен на кристалл, он может быть просто жестко подключен внутри. Я не уверен, работает ли еще перенаправление прерываний или все это идет на выделенное ядро. @MargaretBloom, что ты об этом знаешь?   -  person Lewis Kelsey    schedule 28.03.2019
comment
@LewisKelsey Мне пришлось бы немного почистить спецификации, я помню, что у PCI были линии INTA / B / C / D, которые могут идти либо к IOAPIC, либо к PIC. И PIC, и IO APIC были в южном мосту (сегодня они в PCH и в кристалле, только если PCH есть). Существовала логика маршрутизации для сопоставления линий PCI INTx с контактами IRQx PIC. IOAPIC не нуждается в этом, поэтому маршрутизация может быть жестко привязана к нему. Сам PCI не должен знать о цикле шины INTA (что было в ISA), вместо этого линии INTx подключаются к контроллеру прерываний (PIC или IOAPIC).   -  person Margaret Bloom    schedule 28.03.2019
comment
Способ использования PIC и APIC определяет режим (например, режим виртуального провода, симметричный ввод-вывод, режим PIC). PCIe по-прежнему имеет устаревшие прерывания, а также MSI и MSI-X. Поскольку MSI очень гибкие, они используются все чаще, а IO APIC устаревает. См. это для IOAPIC/APIC/ Режим PIC и это для прерываний PCIe.   -  person Margaret Bloom    schedule 28.03.2019