Как ЦП находит ISR и различает устройства

Сначала я должен поделиться всем, что знаю - а это полный хаос. По теме есть несколько разных вопросов, поэтому не сердитесь :).

1) Чтобы найти ISR, процессору предоставляется номер прерывания. В машинах x86 (286/386 и выше) есть IVT с ISR в нем; каждая запись размером 4 байта. Поэтому нам нужно умножить номер прерывания на 4, чтобы найти ISR. Итак, первая группа вопросов - я полностью запутался в механизме получения прерывания процессором. Чтобы вызвать прерывание, сначала устройство проверяет наличие прерывания - что потом? Номер прерывания перемещается "по IRQ" в сторону ЦП? Я также читал что-то вроде устройства, помещающего адрес ISR на шину данных; что это тогда? Каково понятие устройств, подавляющих ISR. Может ли кто-нибудь подсказать мне несколько примеров устройств, на которых процессор опрашивает прерывания? И где ISR для них находит?

2) Если два устройства совместно используют IRQ (что очень возможно), чем отличается ЦП между ними? Что, если оба устройства одновременно вызовут прерывание с одинаковым приоритетом. Я узнал, что будет маскирование прерываний одного типа и с низким приоритетом - но как эта связь происходит между процессором и контроллером устройства? Я изучал роль PIC и APIC в этой проблеме, но не мог понять.

Спасибо за прочтение. Большое спасибо за ответ.


person ultimate cause    schedule 10.04.2010    source источник


Ответы (2)


Процессоры не опрашивают прерывания, по крайней мере, в программном смысле. Что касается программного обеспечения, прерывания - это асинхронные события.

Что происходит, так это то, что оборудование в ЦП распознает запрос прерывания, который является электрическим входом на линии прерывания, и в ответ откладывает нормальное выполнение событий для ответа на прерывание. В большинстве современных ЦП то, что происходит дальше, определяется аппаратным подтверждением связи, зависящим от типа ЦП, но большинство из них получают какое-либо число от устройства прерывания. Это число может быть 8 бит, 32 или что угодно, в зависимости от конструкции процессора. Затем ЦП использует этот номер прерывания для индексации в таблице векторов прерываний, чтобы найти адрес для начала выполнения подпрограммы обслуживания прерывания. Как только этот адрес определен (и текущий контекст выполнения безопасно сохранен в стеке), ЦП начинает выполнение ISR.

Когда два устройства совместно используют линию запроса прерывания, они могут вызвать запуск разных ISR, возвращая другой номер прерывания во время этого процесса установления связи. Если у вас достаточно доступных векторных номеров, каждое устройство прерывания может использовать свой собственный вектор прерывания.

Но два устройства могут даже совместно использовать строку запроса прерывания и вектор прерывания, при условии, что общий ISR достаточно умен, чтобы вернуться ко всем возможным источникам данного прерывания и проверить регистры состояния, чтобы увидеть, какое устройство запросило обслуживание.

Еще немного подробностей

Предположим, у вас есть система, состоящая из ЦП, контроллера прерываний и устройства прерывания. Раньше это были отдельные физические устройства, но теперь все три могут даже находиться в одном чипе, но все сигналы по-прежнему находятся внутри керамического корпуса. Я собираюсь использовать процессор powerPC (PPC) со встроенным контроллером прерываний, подключенный к устройству на шине PCI, в качестве примера, который должен хорошо служить.

Допустим, устройство представляет собой последовательный порт, по которому передаются некоторые данные. Типичный драйвер последовательного порта загружает кучу данных в FIFO устройства, и ЦП может выполнять обычную работу, пока устройство делает свое дело. Обычно эти устройства могут быть сконфигурированы так, чтобы генерировать запрос прерывания, когда на устройстве заканчиваются данные для передачи, чтобы драйвер устройства мог вернуться и передать ему больше.

Аппаратная логика устройства ожидает подтверждения прерывания шины PCI, после чего может произойти несколько вещей. Некоторые устройства используют «автовекторизацию», что означает, что они полагаются на контроллер прерываний, чтобы следить за тем, чтобы была выбрана правильная процедура обслуживания. У других будет регистр, который будет предварительно запрограммирован драйвером устройства, который содержит вектор прерывания, который устройство поместит на шину данных в ответ на подтверждение прерывания, чтобы контроллер прерывания мог его подобрать.

Шина PCI имеет только четыре линии запроса прерывания, поэтому нашему последовательному устройству придется подтвердить одну из них. (Неважно, какой на данный момент, это обычно в некоторой степени зависит от слота ..) Следующим на очереди идет контроллер прерывания (например, PIC / APIC), который решает, подтверждать ли прерывание на основе битов маски, которые были установлены в собственные регистры. Предполагая, что он подтверждает прерывание, он либо получает вектор от устройства прерывания (через линии шины данных), либо может, если так запрограммировано, использовать «стандартное» значение, предоставляемое собственным драйвером устройства APIC. До сих пор ЦП был в блаженном неведении обо всем этом, но это скоро изменится.

Теперь настало время, чтобы контроллер прерываний привлек внимание ядра ЦП. ЦП будет иметь свой собственный бит (биты) маски прерывания, что может привести к тому, что он просто проигнорирует запрос от PIC. Если предположить, что ЦП готов принимать прерывания, пора начинать настоящие действия. Текущая инструкция обычно должна быть удалена до начала ISR, поэтому с конвейерными процессорами это немного сложно, но достаточно сказать, что в какой-то момент в потоке инструкций контекст процессора сохраняется в стеке и на оборудовании. -определенная ISR вступает во владение.

Некоторые ядра ЦП имеют несколько строк запроса и могут запускать процесс сужения того, какая ISR выполняется с помощью аппаратной логики, которая передает указатель инструкции ЦП одному из нескольких обработчиков верхнего уровня. Старый 68К, а возможно и другие так и поступали. PowerPC (и я считаю, что x86) имеет единственный вход запроса прерывания. Сам x86 ведет себя немного как PIC и может получать вектор от внешних PIC, но powerPC просто переходит на фиксированный адрес 0x00000500.

В PPC код по адресу 0x0500, вероятно, просто немедленно выскочит куда-нибудь в памяти, где достаточно места для какого-то серьезного кода для принятия решений, но это все еще процедура обслуживания прерывания. Эта процедура сначала перейдет к PIC и получит вектор, а также попросит PIC прекратить передачу запроса прерывания в ядро ​​ЦП. Как только вектор известен, ISR верхнего уровня может обратиться к более конкретному обработчику, который будет обслуживать все устройства, которые, как известно, используют этот вектор. Затем обработчик, специфичный для вектора, просматривает список устройств, назначенных этому вектору, проверяя биты состояния прерывания в этих устройствах, чтобы увидеть, какие из них нуждаются в обслуживании.

Когда обнаруживается, что устройство, подобное гипотетическому последовательному порту, требует обслуживания, ISR для этого устройства предпринимает соответствующие действия, например, загружает данные следующего FIFO из буфера операционной системы в FIFO передачи порта. Некоторые устройства автоматически отбрасывают свой запрос на прерывание в ответ на доступ, например, запись байта в передающий FIFO может заставить устройство последовательного порта деактивировать строку запроса. Другим устройствам потребуется специальный бит регистра управления для переключения, установки, очистки и т.д., чтобы отбросить запрос. Существуют миллионы различных устройств ввода-вывода, и ни одно из двух из них, кажется, никогда не делало бы это одинаково, поэтому трудно обобщать, но обычно это так.

Теперь, очевидно, есть еще кое-что, что можно сказать - как насчет приоритетов прерывания? что происходит в многоядерном процессоре? А как насчет вложенных контроллеров прерываний? Но я сжег достаточно места на сервере. Надеюсь, что это поможет.

person JustJeff    schedule 10.04.2010
comment
Спасибо, Джефф. Хотя мой вопрос все еще там. Я понимаю, что для поиска ISR используется номер прерывания. Тогда мой следующий вопрос заключался в том, каким образом процессор получает этот номер? Это происходит через шину данных или как еще? Также, где APIC помещаются на картинке для устройств, разделяющих IRQ? Ваш пост был очень полезным, напомнив мне об использовании регистров состояния устройства. Большое тебе спасибо. - person ultimate cause; 10.04.2010
comment
Хорошее объяснение Джеффа. Еще раз спасибо за усилия. У меня были похожие мысли, как будто может существовать древовидная структура для обработки прерываний. Но теперь я знаю, что другие думают так же, и вы хорошо прокомментировали это. Спасибо еще раз. - person ultimate cause; 11.04.2010
comment
Один маленький вопрос. Вектор прерывания - это просто число, которое вводится в таблицу векторов прерываний для получения адреса ISR. Тогда как это Вектор? Номер прерывания в порядке. - person Shashwat; 16.11.2012
comment
@Shashwat, это число совпадает с входными числами картинки или может быть запрограммировано в apic. - person Karim Manaouil; 24.06.2017

Я подошел к этому вопросу через 3 года .. Надеюсь, что смогу помочь;)

Intel 8259A или просто "PIC" имеет 8 контактов, IRQ0-IRQ7, каждый контакт подключается к одному устройству.

Предположим, что вы нажали кнопку на клавиатуре ... напряжение на выводе IRQ1, который подключен к KBD, высокое ... поэтому после прерывания ЦП подтвердите прерывание бла бла бла ... PIC просто делает добавьте 8 к номеру строки IRQ, чтобы IRQ1 означало 1 + 8, что означает 9

Итак, CPU устанавливает свои CS и IP для 9-й записи в векторной таблице .. и поскольку IVT представляет собой массив длинных значений, он просто умножает количество ячеек на 4;)

CPU.CS = IVT [9] .CS CPU.IP = IVT [9] .IP

ESR работает с устройством через порты ввода / вывода;) Извините за мой плохой английский .. Я араб :)

person geekybedouin    schedule 26.02.2013