Комментарии 8
PCIe устройства ведь общаются через MSI ? Кто их обрабатывает в системе?
в pci-e есть и эмуляция посредством сообщений старого механизма с линией прерывания.
Эмуляция? Возможно, но кто ей занимается, pci-e устройство? Чипсет? APIC? ОС?
Если устройство не поддерживает MSI-X и MSI (а это достаточно редкая ситуация нынче), то оно при срабатывании legacy прерывания отправит специальное сообщение, которое будет перехвачено контроллером PCIe, после чего в зависимости от настроек системное прерывание может дёрнуть либо сам контроллер, либо, например, контроллер прерываний (типа GIC в ARM).
Тема прерываний слишком обширна, и хорошо её сопровождать кодовыми примерами. А это уже вылезет за рамки статьи. Когда вёл курс программирования под ядро, то тема прерываний занимала занятий на несколько дней. Большие объёмы для понимания и работы с механизмами обработки.
Прерывание может быть сгенерировано несколькими способами:
Level: Прерывание регистрируется при изменении сигнала с 0 на 1 ...
Edge: Прерывание регистрируется изменением напряжения на входе с 0 на 1 или с 1 на 0 ... NAPI (new API): подход к генерации прерываний для сетевых драйверов Linux.
При чем тут Linux и сетевые драйвера?
Level: - не корректное описание!
В x86 запись IDT имеет 8 байт и называется воротами.
Дескриптором прерывания же. Даже по названию - Interrupt Descriptor Table (IDT).
Потому прерывания делиться на TOP HALF — которые нужно немедленно
обработать, например аппаратные ошибки, и BOTTOM HALF — обработку
которых можно отложить.
Это не два вида прерываний, а обработчики одного и того же прерывания. Сначала выполняется top half и происходит возврат из прерывания, при этом в очередь на обработку ставиться bottom half, который выполнится позже, уже не в контексте прерывания.
Типичный пример использования - в верхней половине быстро получить от устройства данные, сложить их в буфер и выйти. В нижней же половине данные из буфера обрабатываются и выполняются всякие другие нужные действия, занимающие продолжительное, с точки зрения прерываний, время. При этом прерывания разрешены, и могут, например, выполнятся верхние половины того же прерывания.
Тайны пингвина: как работают исключения и прерывания в Linux?