У старых прерываний INTx есть два проблемных свойства:
- Для каждого сигнала INTx требуется отдельная сигнальная линия в аппаратном обеспечении; а также
- сигнал прерывания не зависит от других сигналов данных и отправляется асинхронно.
Последствия таковы, что
- несколько устройств и драйверов должны иметь возможность совместно использовать прерывания (обработчик прерываний должен проверить, действительно ли его устройство вызвало прерывание); а также
- когда драйвер получает прерывание, ему необходимо прочитать какой-либо регистр устройства, чтобы убедиться, что все предыдущие записи DMA, сделанные устройством, видны на ЦП.
Как правило, оба случая обрабатываются драйвером, считывающим регистр состояния прерывания своего устройства.
Прерывания, сигнализируемые сообщением, не требуют отдельной сигнальной линии, а передаются в виде сообщения по шине данных. Это означает, что одно и то же оборудование может поддерживать намного больше прерываний (поэтому совместное использование не требуется) и что сообщение о прерывании автоматически синхронизируется с любым доступом к DMA. Как следствие, обработчику прерывания не нужно ничего делать; прерывание гарантированно исходит от его устройства, а данные DMA гарантированно уже получены.
Если бы некоторые драйверы были написаны для совместного использования некоторого MSI, обработчику прерывания снова пришлось бы проверять, действительно ли прерывание исходит от его собственного устройства, и не было бы никакого преимущества перед прерываниями INTx.
MSI не используются совместно, потому что это невозможно, а потому что это не необходимо.
Обратите внимание, что совместное использование MSI на самом деле возможно: как видно из этого отрывка из /proc/interrupts
, драйверы Advanced Error Reporting, Power Management Events и hotplugging используют одно прерывание:
64: 0 0 PCI-MSI-edge aerdrv, PCIe PME, pciehp
Эти драйверы на самом деле подключены к одному и тому же устройству, но они по-прежнему ведут себя аналогично драйверам INTx, т. е. они регистрируют свое прерывание с помощью IRQF_SHARED
, а обработчики прерывания проверяют, была ли это их собственная функция, вызвавшая прерывание. .
person
CL.
schedule
20.12.2015