2015-11-03 2 views
0

После многого чтения об обработке прерываний и т. Д., Я все еще могу разобраться с полным процессом обработки прерываний с самого начала.Общие сведения об аппаратных прерываниях и исключениях на процессорном и аппаратном уровне

Например: Деление на ноль. CPU получает команду для деления числа на ноль и отправки его в ALU. Предполагая, что ALU начал процесс деления или выполнил некоторые проверки перед его запуском.

  1. Как исключение сигнализируется CPU?
  2. Как ЦП знает, какое исключение произошло из только одного битового сигнала? Есть ли регистр, который читается после того, как его прервут, чтобы это узнать? 2. Как мое приложение выхватывает исключение? Нужно ли мне написать какую-нибудь функцию, чтобы поймать specipic SIGNAL или что-то еще? И когда я пишу процедуру обработки истечения, как Try {} Catch {} И возникает исключение, как я могу узнать, что выкидывает и обрабатывает?

Самая важная часть, которая меня беспокоит, например, когда сигнал перехвата сигнализируется с клавиатуры на PIC, в свою очередь, pic указывает на процессор, что произошло прерывание, изменив wite INT. Но как ЦП знает, какое устройство нужно обслуживать? Каковы процессы, выполняемые ЦП при включении PIN-кода INTR? Есть ли у него процедура, которая проверяет некоторый регистр, который имеет значение прерывания (которое установлено ПОС при включении провода INT?)

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

Спасибо.

+0

Может быть прочитано http://wiki.osdev.org/Interrupts (предполагается, что x86 arch) – BadZen

+0

Уже прочитал – user3601643

+0

Ну, тогда как часть «Когда приходит прерывание, IDT (который устанавливается ОС в advance) используется для перехода на часть кода ОС, которая обрабатывает прерывание .... «не ответите на свой вопрос? – BadZen

ответ

0

Существует, как правило, несколько вещей, связанных с прерываниями, кроме как только штырь. Обычно для более поздних микроконтроллеров имеется вектор прерывания, помещенный в память, который адресует каждый вызов прерывания, и регистр, который сигнализирует о событии/флаге прерывания.

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

В конкретном случае исключений, таких как деление на 0, это действительно будет обнаружено ALU, CPU может предложить или не производное прерывание, которое мы будем вызывать в таких событиях. Для других типов исключений прерывание может быть недоступным, и процессор просто будет действовать соответственно, например, перезагрузка.

В заключении будет происходить прерывания события следующим образом:

  1. события прерывания помеченного и соответствующий флаг на регистре установлен
  2. Когда придет время, процессор будет переключиться на контекст прерывания.
  3. В конце обработчика флаг прерывания очищается, а ЦП готов повторно перефразировать прерывание при следующем событии.

Решение между прерываниями, поступающими одновременно или различными прерываниями приоритета, зависит от другого оборудования.

0

Проще всего понять прерывания, если начать с того, как они работают на Z80 в простейшем режиме прерывания. Этот процессор проверяет состояние вывода , называемого/IRQ, в определенной точке во время каждой команды; если флаг установлен и установлен флаг «прерывание включен», то, когда пришло время для извлечения следующей команды, процессор не будет продвигать счетчик программ или не считывать байт из памяти, а вместо этого отключает флаг «interrupt enabled» и «притвориться», что он читает инструкцию «RST 38h». Эта инструкция ведет себя как однобайтная команда «CALL 0038h», нажимая программный счетчик и передавая управление этому адресу.

Код в 0038h затем может опросить различные периферийные устройства, если они нуждаются в какой-либо услуге, используйте команду «ei», чтобы снова включить флаг «Включено прерывание» и выполнить «ret». Если периферийное устройство по-прежнему не нуждается в обслуживании в этой точке, код может возобновиться с тем, что он делал до того, как произошло прерывание. Чтобы предотвратить проблемы, если строка прерывания все еще заявляется при выполнении «ret», некоторая специальная логика будет гарантировать, что строка прерывания будет проигнорирована во время этой команды (или любая другая инструкция, которая сразу же следует за «ei»). Если другое периферийное устройство разработало потребность в обслуживании во время работы обработчика прерываний, система вернется к исходному коду, сообщит о состоянии/IRQ, когда обрабатывает первую команду после возвращения, а затем перезапустит последовательность с помощью RST 38h.

В простом подходе Z80 существует только один вид прерывания; любое периферийное устройство может утверждать/IRQ, и если какое-либо периферийное устройство делает так, Z80 должен будет спросить каждое периферийное устройство, если оно хочет внимания. В более сложных системах возможно иметь множество различных прерываний, так что, когда периферийное устройство нуждается в управлении службами, можно отправить в рутину, предназначенную для обработки только этого периферийного устройства. Тем не менее все те же общие принципы все же применяются: прерывание эффективно вставляет инструкцию «вызов» во все, что было сделано процессором, что-то обеспечивает, чтобы процессор мог обслуживать любое необходимое внимание, не прерывая непрерывный процесс [на Z80, он просто отключает прерывания, но системы с несколькими источниками прерываний могут оставлять источники с более высоким приоритетом включенными при обслуживании более низких], а затем возвращаются к тому, что делал процессор при повторном включении прерываний.

Смежные вопросы