То, что ты описал, делали в древнюю эпоху. Драйвер должен был выполнить минимальный объём необходимых действий (напр. драйвер клавиатуры извлекал всё из буфера клавиатуры в свой личный буфер), а основную обработку откладывали на потом (драйвер клавиатуры преобразовывал коды, переключал раскладки, уведомлял об этом ОС и т.п.).В те давние времена (PIC, APIC, IOAPIC) прерывание приводило к переключению контекста и сбросу кэша. В погоне за скоростью накладные расходы на вызов прерываний сочли чрезмерными. Сейчас, как уже написал, аппаратура не прерывает выполнения программы и ОС обрабатывает прерывания когда задача "Диспетчер прерываний" начнёт выполнение.
Диспетчер прерываний преобразует каждое прерывание в событие (SendMessage) для драйвера (каждый драйвер - это отдельная задача), а когда драйвер получит управление, он столь же рутинно будет обрабатывать события.
> прерывания таки возникают
Прерывания бывают разные видов и не все виды прерывают выполнение текущей программы. 50 лет назад термин "прерывание" казался удачным, сейчас он стал таким же рудиментом, как и напр. "чайник" ("чай") или "стать" (собственное значение утрачено, употребляется лишь в одной фразе - "с какой стати?").