Я реализую драйвер PCIe, и я хотел бы понять, на каком уровне прерывания могут быть или должны быть включены / отключены. Я намеренно не указываю ОС, так как полагаю, что это должно быть актуально для любой платформы. Под уровнями я имею в виду следующее:
- Специфичная для ОС структура обработки прерываний
- Прерывания могут быть отключены или включены в регистрах пространства конфигурации PCI / PCIe, например, регистр COMMAND
- Прерывания также могут маскироваться на уровне устройства, например, мы можем настроить устройство так, чтобы оно не вызывало определенные прерывания для хоста.
Я понимаю, что какой бы тип прерывания не использовался в PCIe (эмуляция INTx, MSI или MSI-X), он должен быть доставлен в хост-ОС.
Поэтому мой вопрос: нужно ли нам на самом деле включать или отключать прерывания на каждом уровне, или этого достаточно только на самом близком к аппаратному обеспечению, например, в соответствующих регистрах PCI?
interrupts
bus
pcie
отметка
источник
источник
Ответы:
Операционные системы обычно громко жалуются на неожиданные прерывания, потому что это легко обнаруживаемые ошибки программирования в драйверах.
Как правило, ваше оборудование запускается в довольно инертном состоянии после сброса, где оно ожидает настройки. В этом состоянии нет никакого значимого способа генерировать прерывание, потому что еще не установлено отображение, и вы не знаете, какое прерывание.
Во время конфигурирования появляется сопоставление прерываний, и карте сообщается, какую линию прерываний использовать (INTA..INTD в качестве устаревшего PCI или MSI / MSI-X), но пока еще нет драйвера для обработки прерываний. У Linux здесь есть обработчик по умолчанию, который жалуется в системный журнал, а затем отключает источник прерываний, так как оборудование кажется неисправным (то есть по умолчанию все прерывания включены, но на самом деле ожидаются только те, для которых зарегистрирован обработчик). ,
Драйвер, наконец, регистрирует обработчики прерываний и разрешает те прерывания, которые ему интересны. Если драйвер больше не интересуется определенным состоянием, ему необходимо отключить прерывание в устройстве, потому что именно там маскируются конкретные причины прерывания устройства - нижние слои знают только, что «что-то случилось».
источник