Ваша клавиатура — очень простое устройство ввода; простое, потому что генерирует малый объем данных и очень медленно (по компьютерным меркам). Когда вы нажимаете или отпускаете клавишу, передаётся сигнал, порождающий аппаратное прерывание (hardware interrupt).
Ожидать таких прерываний — работа операционной системы. Для каждого возможного прерывания есть обработчик прерывания (interrupt handler), это часть операционной системы, которая скрывает любые данные, ассоциированные с ним (например, значение нажатой/отпущенной клавиши), до тех пор пока оно не будет обработано.
Что делает обработчик прерываний, полученных от клавиатуры, так это помещает значение нажатой клавиши в системную область в нижней части памяти. Там оно будет доступно для обзора программе, которая в данный момент с разрешения операционной системы читает ввод с клавиатуры.
Более сложные устройства ввода, такие как жёсткие диски и сетевые карты, работают подобным образом. Ранее я ссылался на то, что дисковые контроллеры используют шину для передачи сигнала о выполнении запроса. Когда прерывание вызывает диск, тогда обработчик прерываний диска копирует поступающие данные в память, чтобы в дальнейшем их могла использовать программа, сделавшая запрос.
С каждым видом прерываний ассоциирован уровень приоритета (priority level). Прерывания, имеющие более низкий приоритет (такие как события клавиатуры), не могут прервать обработку прерываний с более высоким уровнем приоритета (тики таймера, события диска) и ожидают их завершения. Unix спроектирован так, чтобы ускорить и сгладить ответную реакцию машины на запросы пользователя, для этого событиям требующим быстрой обработки, дан высокий приоритет.
Во время загрузки вашей операционной системы вы могли видеть сообщения, ссылающиеся на номера IRQ. Возможно вы в слышали, что одной из распространённых проблем неверно настроенного аппаратного обеспечения является ситуация, в которой два разных устройства пытаются использовать одинаковый IRQ, но не понимали что именно это значит.
Вот ответ. IRQ — это сокращение «Interrupt Request» (запрос прерывания). Операционная система во время загрузки должна узнать, какие устройства будут использовать какие номера прерываний, чтобы ассоциировать соответствующие обработчики прерываний каждому из них. Если два разных устройства попытаются использовать одинаковое прерывание, то иногда оно будет обрабатываться не тем обработчиком. Обычно это, как минимум, сделает устройство недоступным, а иногда может ввести в замешательство операционную систему настолько, что это приведёт к сбоям или аварийному завершению.