На mainbord у нас есть контроллер прерываний (IRC), который действует как мультиплексор между устройствами, которые могут поднять прерывание и CPU:
|--------|
|-----------| | |
-(0)------| IRC _____|______| CPU |
-(...)----| ____/ | | |
-(15)-----|/ | |--------|
|-----------|
Каждое устройство связано с IRQ (число слева). После каждого выполнения CPU определяет линию запроса прерывания. Если обнаружен сигнал, будет выполнено сохранение состояния, а ЦП загрузит процедуру обработчика прерываний, которая может быть найдена в векторе прерываний, который находится по фиксированному адресу в памяти. Насколько я могу видеть, число IRQ и номер вектора в векторе прерываний не совпадают, поскольку у меня есть, например, моя сетевая карта, зарегистрированная в IRQ 8. На процессоре Intel Pentium это будет указывать на рутину, которая используется чтобы сигнализировать одно условие ошибки, поэтому должно быть какое-то отображение, которое указывает на правильный обработчик.
Вопросы:
1) Если я напишу драйвер устройства и зарегистрирую для него IRQ X. Откуда система знает, какое устройство должно быть обработано? Я могу, например, использовать request_irq() с IRQ-номером 10, но как система знает, что обработчик должен использоваться для мыши или клавиатуры или для того, что я пишу драйвер?
2) Как выглядит вектор прерывания? Я имею в виду, что если я использую IRQ 10 для своего устройства, это перепишет стандартный обработчик, который предназначен для обработки ошибок в таблице (первая используемая версия - 32 согласно Silberschatz (понятия операционной системы)).
3) Кто инициализирует IRQ? Биос? ОС?
4) Кто отвечает за соответствие IRQ и смещение в векторе прерываний?
5) Можно разделить IRQS. Как это возможно? На материнской плате есть аппаратные дорожки, которые подключают устройства к контроллеру прерываний. Как можно настроить полосы для одного и того же прерывания? Должна быть таблица, в которой говорится, что дорожка 2 и 3 обрабатывает IRQ15, например. Где находится эта таблица и как она называется?