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

StackOverflow https://stackoverflow.com/questions/2611992

  •  25-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

Другие советы

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

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

Давайте предположим, что вы нажали кнопку на клавиатуре. Напряжение штифта IRQ1, который подключен к KBD, высок .. поэтому после того, как процессор прерывается, подтвердите прерывание BLA BLA BLA ... Добавьте 8 на номер линии IRQ, так что IRQ1 означает 1 + 8, что означает 9

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

CPU.cs = IVT [9] .cs cpu.ip = IVT [9] .ip

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top