У меня есть небольшое ядро, которое загружается с 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 для запуска. У меня еще есть несколько вопросов.
Почему регистр адреса сообщения содержит фиксированную вершину 0xFEE.
Что такое биты RH, DM и XX в регистре адреса сообщения?
Как это работает с LAPIC? В основном, как это вызывает прерывания в LAPIC. Это особая функция устройств PCI, которая позволяет им запускать прерывания в LAPIC. Или это просто то, что устройства PCI записывают в отображаемые в память регистры LAPIC некоторые определенные данные, которые вызывают прерывание. Потому что обычно доступ к LAPIC осуществляется из ядра по адресу, который одинаков для всех LAPIC. Это какое-то межпроцессорное прерывание из-за пределов ЦП?