achesnokov писал(а):
Разница между аппаратным и программным вызовом INT в способе поступления в процессор. Аппаратные прерывания поступают в процессор через контроллер прерываний. Контроллер прерываний позволяет осуществлять маппинг номеров прерываний, что и делается всегда. Т.е. аппаратные прерывания нумеруются, начиная с нулевого, но за счет контроллера прерываний, мапятся на другой диапозон номеров обработчиков прерываний.
Термин "аппаратный" здесь представляется не слишком хорошим. Например, всякие там #PF тоже генерируются аппаратно, а не программно. Так что, ИМХО, эти прерывания надо называть внешними, поскольку их источники логически находятся снаружи процессора.
С точки зрения процессора, есть только два таких внешних источника: один для линии запроса немаскируемого прерывания NMI и другой для линии обычного внешнего прерывания IRQ. Вот на IRQ-то и заведён выход контроллера прерываний, а все внешние устройства выдают свои запросы прерываний (тоже именуемые IRQ, только с номерами: IRQ0, IRQ3 и т.д.) именно контроллеру прерываний. Последний обрабатывает поступившие запросы, выбирает самый приоритетный из числа незамаскированных и, если его приоритет превосходит приоритет текущего обрабатываемого прерывания, выдаёт процессору сигнал IRQ. Процессор, если прерывания не запрещены, выдаёт контроллеру прерываний сигнал подтверждения прерывания, и контроллер прерываний в ответ выдаёт номер вектора прерывания. Отображение номеров запросов прерываний на номера векторов задаётся программно при инициализации контроллера прерываний. Разработчики БИОСа сделали так, что прерывания IRQ0-IRQ7 отображаются на некоторые из зарезервированных векторов (не помню, на какие именно), но нормальные ОС изменяют это отображение, перепрограммируя контроллер прерываний.
Замечу, что описанная выше схема является в общих чертах верной, но достаточно условной. Кроме того, она соответствует однопроцессорной системе, каковыми были все классические ПК. Однако с появлением многопроцессорных (а позже -- многоядерных, которые логически ничем принципиально от многопроцессорных не отличаются, лишь процессоры там выполнены не в виде отдельных микросхем, а как единая микросхема) систем обработка прерываний претерпела определённые изменения. В частности, традиционный контроллер прерываний PIC сохраняется лишь для совместимости со старыми системами, а новые, поддерживающие многопроцессорность, должны использовать APIC (определённая возможность использовать PIC при этом сохраняется, но вряд ли имеет смысл в большинстве случаев).