есть такой вопрос насчёт драйверов.
Понимаю, что проще проверить на живом железе, но пока возможности нет.
Вот допустим, я в драйвере заявил, что он умеет обрабатывать IRQ прерывания. Допустим, PCI-ная плата дёрнула какую-то INT# ногу, сообщив компу, что у неё возникло прерывание, и надо бы его обработать. Как я понимаю, комп +- в этот момент вызовет обработчик прерывания, зарегенный в драйвере.
Вопрос в том: Что случится дальше, если плата не "отпустит" INT#? Комп будет дёргать обработчик прерывания "до победного" и зависнит к хренам? Или это как-то штатно разруливается?
В общем, именно так. Если к моменту подачи команду EOI в APIC сигнал прерывания ещё висит -- то он вызовет следующее прерывание сразу (ну, сразу как только процэссор скажэт STI, поскольку EOI в APIC обычно подают при заблокированных прерываниях, разблокируют их только по IRET из вектора).
И да, правильная последовательность действий -- внутриядерный обработчик обнаружывает номер прерывания в APIC, по очереди вызывает каждый из драйверов-обработчиков такого прерывания (в PCI они могли мультиплексироваться между несколькими устройствами, потому заранее неизвестно, какое устройство его вызвало), каждый обработчик проверяет свою плату, сбрасывает состояние прерывания (если есть) и делает всё, что ему интересно. После всех обработчиков ядро посылает EOI в APIC.
А, то есть у меня может вызваться обработчик просто так? Еще лучше
Обсуждают сегодня