Как процессор находит ISR и различает устройства - PullRequest
9 голосов
/ 10 апреля 2010

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

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

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

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

Ответы [ 2 ]

13 голосов
/ 10 апреля 2010

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

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

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

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

Немного подробнее

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

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

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

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

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

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

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

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

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

4 голосов
/ 27 февраля 2013

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

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

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

ТАК ЦП устанавливает свои CS и IP на 9-ю запись в таблице векторов ... и поскольку IVT является массивом длин, он просто умножает количество ячеек на 4;)

CPU.CS = ИВТ [9] .cs CPU.IP = ИВТ [9] .IP

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

...