Как MSI-X запускает обработчики прерываний? Есть ли необходимость опрашивать выбранный адрес памяти?

У меня есть небольшое ядро, которое загружается с UEFI. Я использую QEMU для виртуализации. Я хочу написать драйвер xHCI для поддержки USB-клавиатур в моем ядре. Мне трудно найти краткую и четкую информацию. Я нашел xHCI в своем ядре. У меня есть указатель на его пространство конфигурации PCI. Он поддерживает MSI-X. Я хочу использовать MSI-X, но не могу понять, как это работает с xHCI и USB.

Моя проблема в том, что обычно osdev.org довольно информативен и имеет основу, необходимую мне для реализации некоторых функций. В случае с MSI-X это не так. Мне трудно связать всю информацию, которая у меня есть на osdev.org, с функциональностью MSI-X.

Итак, в основном я нахожу таблицу MSI-X, а затем устанавливаю там несколько адресов, чтобы сообщить устройству xHCI PCI о необходимости записи по этому адресу для запуска прерывания. Но вызывается ли в какой-то момент обработчик прерывания? Нужно ли мне опрашивать этот адрес, чтобы определить, произошло ли прерывание? Я бы подумал, что поле Vector Control в таблице MSI-X позволяет мне установить вектор прерывания, но все биты зарезервированы.

ИЗМЕНИТЬ

Я нашел следующие вопросы и ответы stackoverflow, которые частично отвечают на мой вопрос: Вопрос о сигнальных прерываниях (MSI) в системе x86 LAPIC.

Таким образом, младший байт регистра данных содержит вектор для запуска, а регистр адреса сообщения содержит идентификатор LAPIC для запуска. У меня еще есть несколько вопросов.

  1. Почему регистр адреса сообщения содержит фиксированную вершину 0xFEE.

  2. Что такое биты RH, DM и XX в регистре адреса сообщения?

  3. Как это работает с LAPIC? В основном, как это вызывает прерывания в LAPIC. Это особая функция устройств PCI, которая позволяет им запускать прерывания в LAPIC. Или это просто то, что устройства PCI записывают в отображаемые в память регистры LAPIC некоторые определенные данные, которые вызывают прерывание. Потому что обычно доступ к LAPIC осуществляется из ядра по адресу, который одинаков для всех LAPIC. Это какое-то межпроцессорное прерывание из-за пределов ЦП?


person user123    schedule 09.04.2021    source источник
comment
Я думаю, что чаще местный APIC пишется как LAPIC с заглавной L, в случае шрифтов, которые делают его похожим на I в верхнем регистре.   -  person Peter Cordes    schedule 10.04.2021


Ответы (1)


  1. Почему регистр адреса сообщения содержит фиксированную вершину 0xFEE.

Процессоры подобны сети — пакеты с заголовками, описывающими их содержимое, которые маршрутизируются по набору ссылок на основе адресов (которые похожи на IP-адрес в пакете TCP/IP).

MSI, по сути, представляет собой пакет, говорящий о записи этих данных по этому адресу, где адрес соответствует другому устройству (локальный APIC внутри ЦП) и необходим, потому что это то, что требуется протоколу/протоколам для шины для этого типа пакета/сообщения, и потому что это сообщает локальному APIC, что он должен принять пакет и вмешаться. Если часть адреса неверна, то это будет выглядеть как любая другая запись во что-либо еще (и не будет принято локальным APIC и не будет доставлено в качестве IRQ на ядро ​​​​ЦП).

Примечание. Теоретически для большинства ЦП (Intel) можно изменить физический адрес локального APIC. На практике нет разумной причины когда-либо хотеть это делать, и если физический адрес локального APIC изменится, я думаю, что стандартный/исходный диапазон адресов 0xFEE..... все еще жестко привязан к локальному APIC для принятия MSI. .

  1. Что такое биты RH, DM и XX в регистре адреса сообщения?

Локальный APIC (среди прочего) используется программным обеспечением (ядром) на одном ЦП для отправки IRQ/s на другие ЦП; называются межпроцессорными прерываниями (IPI). Когда MSI был изобретен, они просто повторно использовали те же самые флаги, которые уже существовали для IPI. Другими словами, DM (режим назначения) и большинство других битов определены в разделе руководства Intel, описывающего локальный APIC. Чтобы правильно понять эти биты, вам нужно понять локальные APIC и IPI; особенно часть о доставке IPI.

Позже (при внедрении аппаратной виртуализации) Intel добавила подсказку перенаправления (чтобы разрешить перенаправление IRQ с устройств на определенные виртуальные машины). Это описано в спецификации под названием «Технология виртуализации Intel® для спецификации архитектуры направленного ввода-вывода» (доступна здесь: https://software.intel.com/content/www/us/en/develop/download/intel).-технология-виртуализации-для-ориентированной-io-архитектуры-спецификации.html ).

Еще позже Intel хотела поддерживать системы с более чем 255 процессорами, но идентификатор APIC был 8-битным (ограничивая систему до 255 процессоров и одного APIC ввода-вывода). Чтобы исправить это, они создали x2APIC (который изменил кучу вещей - 32-битные идентификаторы APIC, локальный APIC, к которому обращаются MSR вместо физических адресов, ...). Однако все старые устройства (включая IO APIC и MSI) были разработаны для 8-битных идентификаторов APIC, поэтому для решения этой проблемы они просто переработали то же самое переназначение IRQ, которое у них уже было (из виртуализации), чтобы IRQ с 8-битными идентификаторами APIC могут быть переназначены на IRQ с 32-битными идентификаторами APIC. Результат относительно ужасен и чрезмерно запутан (например, ядро, которое хочет поддерживать множество ЦП, должно использовать IOMMU для вещей, которые не имеют ничего общего с виртуализацией), но работает без проблем с обратной совместимостью.

  1. Как это работает с lAPIC? В основном, как это вызывает прерывания в lAPIC.

Я ожидаю, что (для P6 и более поздних версий - 80486 и Pentium вместо этого использовали другую трехпроводную шину APIC) все они используют один и тот же формат пакета (сообщения) - например. что IO APIC отправляет тот же пакет/сообщение для записи этих данных в этот адресный пакет/сообщение (на локальный APIC), который используется IPI и MSI.

Это какое-то межпроцессорное прерывание из-за пределов ЦП?

Да! :-)

person Brendan    schedule 10.04.2021
comment
Как вы и подозревали, изменение адреса локального APIC не влияет на адрес MSI. Адрес MSI зашит не только в локальный APIC, но и во многие другие части неядра. - person prl; 10.04.2021