На x86, когда ОС отключает прерывания, исчезают ли они или останавливаются в очереди и "ждут", чтобы прерывания возвращались?

Моя платформа - x86 и x86-64, в Windows.

Точка системы приоритета прерывания состоит в том, чтобы прерывание с наивысшим приоритетом выбивало другие. Чтобы обеспечить соблюдение этого, я предполагаю, что Windows полностью отключит все прерывания более низкого уровня, пока ISR для прерывания более высокого уровня не будет завершен.

Но если CPU не прослушивает прерывания, что происходит? Они просто молча исчезают? Или они поставлены в очередь на аппаратное обеспечение, ожидая, что прерывания снова станут включенными? Если они хранятся, где? Существуют ли ограничения для того, сколько может стоять в очереди? Что произойдет, если слишком много прерываний не будут обработаны? Какая аппаратура существует для обнаружения проблем, если есть редкие условия, когда обработка прерываний задерживается?

Ответ 1

Некоторые фон

Прерывания с периферийных устройств напрямую не обрабатываются ЦП, а вместо аппаратного обеспечения - "Программируемый контроллер прерываний". Ранее системы использовали PIC - (Intel 8259), но из-за отсутствия поддержки для SMP-систем, в настоящее время Adavnced PIC - APIC (Intel 82093). APIC имеет два компонента: IO APIC (часть материнской платы) перенаправляет эти запросы прерываний на локальный APIC (часть процессора).
Но эти аппаратные средства просто передают сообщения в CPU, фактическая обработка выполняется драйвером устройства конкретного устройства.

Теперь на ваши вопросы

Но если CPU не прослушивает прерывания, что происходит? Они просто молча исчезают? Или они поставлены в очередь на аппаратное обеспечение, ожидая, что прерывания снова станут включенными?

В этой статье обсуждаются два класса обработчиков прерываний в зависимости от того, насколько быстро они выполняются:
1. Fast: запуск с дальнейшими прерываниями отключен,
2. Slow: запуск с включенными прерываниями.
Но теперь различие между ними стало устаревшим, поскольку задачи/рабочие очереди (верхняя и нижняя половина - звонки?) Сделали время выполнения обработчиков очень мало, поэтому теперь прерывания обработчиков запускаются с включенными прерываниями. Для более медленных устройств, таких как I2C, мы перешли к новому методу
Threaded Interrupt Handler, который даже лучше, чем подход верхней/нижней половины. В случае, если для какого-либо устройства, если вышеупомянутые методы не работают, чем обработчик выполняется с отключенными прерываниями и да в этом случае, вы продолжаете проигрывать прерывания, но я не могу найти какой-либо экземпляр, где это происходит.

Если они сохранены, где? Существуют ли ограничения для того, сколько может стоять в очереди? Что произойдет, если слишком много прерываний не будут обработаны?

Нет, они не находятся в очереди, это плохой обработчик обработчика прерываний, если прерывания необходимо отключить, и это слишком длительное время.

Какая аппаратура существует для обнаружения проблем, если есть редкие условия, при которых обработка прерываний задерживается?

Если прерывания отключены, то вы ничего не можете сделать, но если они включены, и вы продолжаете получать больше прерываний, то это приводит к вложению прерываний в той степени, в которой может произойти сбой системы. Затем для определения причины может использоваться дамп ядра.