Вопрос о прерываниях, сигнализируемых сообщениями (MSI), в системе x86 LAPIC

Привет, я пишу ядро ​​и планирую использовать прерывание MSI для устройств PCI.

Тем не менее, я также весьма смущен документацией.

Мое понимание MSI следующее:

С точки зрения устройства PCI:

  1. В документации указано, что мне нужно найти Capabillty ID = 0x05, чтобы найти 3 регистра: регистры управления сообщениями (MCR), адреса сообщений (MAR) и данных сообщений (MDR).
  2. MCR обеспечивает функциональность управления для прерывания MSI,
  3. MAR предоставляет физический адрес, который PCI-устройство запишет при возникновении прерывания.
  4. MDR формирует фактические данные, которые он будет записывать в физический адрес.

С точки зрения процессора:

  1. Документация показывает, что регистр адреса сообщения содержит фиксированную вершину 0xFEE, за которой следует идентификатор пункта назначения (LAPIC ID) и другие управляющие биты следующим образом:

    введите здесь описание изображения

  2. Регистр данных сообщения будет содержать следующую информацию, включая вектор прерывания:

    введите здесь описание изображения


Прочитав все это, я думаю, что если APIC_ID равен 0x0h, будет ли адрес сообщения конфликтовать с отображением локальной памяти APIC? Хотя адреса FEE00000~FEE00010 зарезервированы.

Кроме того, верно ли, что номер вектора в MDR соответствует номеру вектора IDT. Другими словами, если я поставлю MAR = 0xFEE0000C (идентификатор назначения = 0, с использованием логического идентификатора APIC) и MDR = 0x0032 (триггер по фронту, вектор = 50) и включу прерывание MSI, то, как только устройство выдаст прерывание, ЦП соответственно запустится. функция, указанная IDT[50]? После этого я пишу 0h в регистр EOI, чтобы завершить его?

Наконец, по документации старшие 32 бита MAR не используются? Кто-нибудь может помочь в этом?

Большое спасибо!


person Shore    schedule 05.09.2019    source источник
comment
@prl Регистр управления сообщениями предоставляет возможность использовать 32-битную или 64-битную адресацию, означает ли это, что мне не нужно устанавливать для него 64-битную модель адресации ??   -  person Shore    schedule 05.09.2019
comment
@prl Кроме того, что, если я переназначу адрес LAPIC и вручную создам конфликт адресации ?? Что случилось бы?   -  person Shore    schedule 05.09.2019
comment
@prl Итак, если я установлю MAR = 0xFEE0000C и MDR = 0x0032, устройство вызовет IDT[50], верно?? И не могли бы вы опубликовать свой ответ, и я приму его.   -  person Shore    schedule 05.09.2019


Ответы (1)


Вы правильно понимаете, как обнаруживать и программировать MSI в устройстве PCI (или PCIe).* Адрес сообщения определяет место назначения (на какой ЦП отправляется прерывание), а данные сообщения содержат номер вектора. Для обычных прерываний все биты данных сообщения должны быть равны 0, кроме младших 8 битов, которые содержат вектор. Вектор является индексом в IDT, поэтому, если данные сообщения равны 0x0032, прерывание доставляется через запись 50 IDT.**

Если Destination ID в сообщении прерывания равен 0, адрес сообщения MSI соответствует адресу по умолчанию локального APIC, но они не конфликтуют, поскольку APIC может быть записан только ЦП, а MSI могут быть записаны только процессором. устройства.

На платформах x86 старшие 32 бита адреса сообщения должны быть равны 0. Это можно сделать, установив старшую часть адреса сообщения на 0 или запрограммировав устройство на использование 32-битного адреса сообщения (в этом случае старшие регистр адреса сообщения не используется). Спецификация PCI была разработана для работы с системами, в которых используются 64-битные адреса MSI, но системы x86 никогда не используют старшие 32 бита адреса сообщения.

Перепрограммирование базового адреса APIC путем записи в MSR APIC_BASE не влияет на диапазон адресов, используемый для MSI; это всегда 0xFEExxxxx.


* Вам также следует обратить внимание на возможности MSI-X, поскольку некоторые устройства поддерживают MSI-X, но не MSI. MSI-X немного более гибкий, что неизбежно усложняет его.

** При использовании возможности MSI данные сообщения не совпадают со значением в регистре данных сообщения (MDR). Возможность MSI позволяет устройству использовать несколько смежных векторов. Когда устройство отправляет сообщение о прерывании, оно заменяет младшие биты MDR другим значением в зависимости от причины прерывания в устройстве.

person prl    schedule 04.10.2019