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

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

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

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

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

10
задан ultimate cause 10 April 2010 в 02:21
поделиться

1 ответ

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

Что происходит, так это то, что аппаратное обеспечение в ЦП распознает запрос прерывания, который является электрическим входом на линии прерывания, и в ответ откладывает нормальное выполнение событий для ответа на прерывание. В большинстве современных ЦП то, что происходит дальше, определяется аппаратным подтверждением связи, зависящим от типа ЦП, но большинство из них получают какое-либо число от устройства прерывания. Это число может быть 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 может заставить устройство последовательного порта деактивировать строку запроса.Другим устройствам потребуется специальный бит регистра управления для переключения, установки, очистки и т.д., чтобы отбросить запрос. Существует бесчисленное количество различных устройств ввода-вывода, и ни одно из двух из них, кажется, никогда не делало бы это одинаково, поэтому трудно обобщить, но обычно это так.

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

13
ответ дан 3 December 2019 в 21:20
поделиться