2

Я реализую драйвер PCIe, и я хотел бы понять, на каком уровне прерывания могут быть или должны быть включены/отключены. Я намеренно не указываю ОС, поскольку я предполагаю, что это должно быть релевантно для любой платформы. На уровне я имею в виду следующее:Нужно ли включать или отключать прерывания PCI на каждом уровне или только на самом близком к оборудованию?

  • OS конкретных прерываний обработки Рамочный
  • Прерывания может быть отключена или включена в пространстве регистров конфигурации PCI/PCIe, например, КОМАНДА регистр
  • Прерывание также может быть замаскировано на уровне устройства, например, мы можем настроить устройство не вызывать определенные прерывания хоста

Я понимаю, что все, что прерывание типа используется на PCIe (IntX эмуляция, MSI или MSI-X), он должен быть доставлен в ОС хоста.

Так что мой вопрос действительно - действительно ли нам нужно включать или отключать прерывания на каждом уровне, или это достаточно только в ближайшем к оборудованию, например. в соответствующих регистрах PCI?

ответ

1

Отключение прерываний на разных уровнях обычно имеет совершенно разные цели.

Отключение прерываний:

  • В ОС (на самом деле, это означает, в CPU) - Это, как правило, об уходе условий гонки. В частности, если повреждение состояния/памяти может произойти в течение определенного раздела кода, если процессор был прерван, тогда в этом разделе кода необходимо отключить обработку прерываний. Обработчики прерываний не должны приобретать обычные блокировки (по определению они не могут быть приостановлены), и они не должны пытаться получить прямую блокировку, удерживаемую потоком, который в настоящее время запланирован на том же CPU (поскольку этот поток заблокирован от продвигается тем же обработчиком прерываний!), поэтому обеспечение безопасности данных с помощью обработчиков прерываний может быть сложным. Обработка прерываний быстро, как правило, хорошая вещь, поэтому вы хотите полностью сводить к минимуму такие разделы в любом коде, который вы пишете. Сделайте как можно больше обработок прерываний в вторичных прерываниях, чтобы избежать таких ситуаций. Вторичные обработчики прерываний на самом деле являются просто обратными вызовами в обычном потоке ОС, который не имеет каких-либо ограничений первичного обработчика прерываний.
  • PCI конфигурации/PCIe - Это мое понимание того, что это в основном о маршрутизации прерываний, и то, что вы обычно делаете один раз, когда ваши загрузки драйвера (или активируется клиентом) и еще раз, когда драйвер выгружается (или деактивируется). На это также могут влиять события управления питанием. В некоторых операционных системах уровень PCI (e) фактически обрабатывается для вас, когда вы активируете прерывания PCI-устройства через API-интерфейсы более высокого уровня.
  • On-device - Как правило, это оптимизация, чтобы избежать прерывания процессора, когда его не нужно прерывать. Наиболее распространенным сценарием является то, что на устройстве происходит событие, поэтому генерируется прерывание. Первичный обработчик прерывания драйвера проверяет регистры устройства, если драйверу необходимо выполнить какую-либо обработку. Если это так, то отключает на устройстве прерывания и планирует запустить обработчик прерывания второго. ОС в конечном итоге запускает вторичный обработчик, который обрабатывает любую информацию, предоставленную устройством, до тех пор, пока не закончится работа.Затем он снова включит прерывания, еще раз проверяет, есть ли работа, ожидающая от устройства, и если ее нет, она завершается. (Если в этой последней проверке есть элементы для обработки, она снова отключает прерывания и начинается с самого начала.) Идея состоит в том, что до тех пор, пока обработчик вторичного прерывания не завершит обработку, на самом деле нет смысла запускать первичный обработчик прерываний и пустая трата ресурсов, если поступят дополнительные события, потому что драйвер уже занят обработкой очереди событий. Окончательная проверка после повторного включения прерываний заключается в том, чтобы избежать состояния гонки между приходом события и повторным включением прерываний.

Надеюсь, что ответит на ваш вопрос.

+0

Это помогает понять, спасибо. Не могли бы вы пояснить следующее: если водитель предпочитает использовать, например, INTx прерывает парадигму, предполагается ли она отключать доставку прерываний MSI/MSI-X (как это возможно через MSI/MSIX возможности PCI-регистров)? То же самое относится к отключению INTx при выборе MSI? В случае Linux это похоже на то, что он выполняется слоем PCI при вызове pci_msi_enable/pci_msix_enable. Является ли это дополнительным и зависит от ОС? – Mark

+1

Стандартизированные регистры возможностей PCI обычно поддерживаются поддержкой PCI PCI. Когда ваш драйвер утверждает устройство и регистрирует его обработчик прерываний с ОС, вы, как правило, имеете возможность выбирать MSI или MSIX. ОС должна знать, что вы используете, чтобы он мог вызвать ваш обработчик в соответствующее время, поэтому он также имеет конфигурацию PCI. Но проверьте документацию/исходный код вашей ОС, если он что-то ожидает от вас. Если на вашем устройстве есть пользовательские регистры выбора векторов MSIX для разных типов событий, вам нужно иметь дело с теми, что есть в вашем драйвере. Надеюсь, это поможет? – pmdj

+0

спасибо, это делает его более ясным. Существует ли требование в спецификациях PCI/PCIe для отключения INTX, когда MSI/MSIX активен? Я искал это в спецификациях, но не смог найти. В конце концов, я полагаю, что только один режим прерывания должен быть активным. – Mark

Смежные вопросы