Как стать автором
Обновить

Тайны пингвина: как работают исключения и прерывания в Linux?

Уровень сложностиПростой
Время на прочтение14 мин
Количество просмотров12K
Всего голосов 41: ↑35 и ↓6+29
Комментарии8

Комментарии 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, который выполнится позже, уже не в контексте прерывания.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий