Найти в Дзене
kerby

Как работают прерывания в процессоре?

Примечание: для лучшего понимания рекомендую прочитать прошлые статьи на моем канале. Приятного чтения. В процессоре есть механизм, который наша операционная система использует и который обслуживает следующие три вещи: Наша программа исполняет какие-то инструкции и тут в этом время пользователь жмёт кнопку на клавиатуре. Мы договорились заранее с процессором, что есть какой-то магический адрес на который во время прерывания должен перейти регистр, выполнить пару инструкций (положить нажатую кнопку в какой-то буффер, например) и прыгнуть обратно - исполнять код. Hardware interrupts (Аппаратные прерывания) Как происходит аппаратное прерывание? У процессора есть свой флаг в регистре флагов - IF (interrupt flag), который недоступен к модификации из пользовательских программ. Если IF взведён (то есть равен 1), то после каждой инструкции у процессора происходит проверка на наличие прерываний - если они есть, то происходит как раз тот самый механизм, который мы до этого обсуждали. Если же

Примечание: для лучшего понимания рекомендую прочитать прошлые статьи на моем канале. Приятного чтения.

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

  1. Hardware interrupts (Аппаратные прерывания)
  2. .Exception (Исключительные ситуации).
  3. Software interrupts (Программные прерывания).

Наша программа исполняет какие-то инструкции и тут в этом время пользователь жмёт кнопку на клавиатуре. Мы договорились заранее с процессором, что есть какой-то магический адрес на который во время прерывания должен перейти регистр, выполнить пару инструкций (положить нажатую кнопку в какой-то буффер, например) и прыгнуть обратно - исполнять код.

Hardware interrupts (Аппаратные прерывания)

-2

Как происходит аппаратное прерывание?

  1. Во-первых, процессор должен откуда-то узнать, что пользователь нажал на клавиатуру.
  2. Во-вторых, узнав об этом, он должен где-то посмотреть - есть ли обработчик для данного события.
  3. В-третьих, выяснив, что обработчик есть - он должен это как-то обработать, сохранив текущее состояние процессора (включая все регистры).
  4. После обработки прерывания мы возвращаемся в наш код с помощью iret - инструкции, которая извлекает из стека три верхних значения и помещает их в регистры IP, CS и флагов.

У процессора есть свой флаг в регистре флагов - IF (interrupt flag), который недоступен к модификации из пользовательских программ.

Если IF взведён (то есть равен 1), то после каждой инструкции у процессора происходит проверка на наличие прерываний - если они есть, то происходит как раз тот самый механизм, который мы до этого обсуждали.

Если же IF не взведён (=0), то процессор просто не реагирует на маскируемые аппаратные прерывания и откладывает эту реакцию до более удобного момента.

(Программные прерывания и исключения обрабатываются тем же самым механизмом ловушек.)

Вызвать программное прерывание можно с помощью ассемблерной инструкции int..

Software interrupts (Программные прерывания).

-3

Нам не хотелось бы обрабатывать приоритеты и очереди прерываний в самом процессоре, тем самым загружая его данной работой. Все эти обработки выносят в отдельную микросхему, которая называется interrupt controller. Мы будем пользоваться стандартом PIC (Programmable Interrupt Controller), который рассчитывает на то, что с ним работает один процессор. В современном компьютере все же устроено немного сложнее - там у каждого ядра процессора есть свой LAPIC (Local Advanded PIC), а глобально во всей системе есть IO APIC (Input Output APIC), который распределяет прерывания между ядрами.

ntitled

азревает сразу же вопрос - “Как же PIC узнает про то, что центральный процессор обработал прерывание и можно сбрасывать сигнал об этом прерывании и браться за следующее?”

Так вот, CPU взаимодействует с PIC с помощью Port Mapped IO — так и узнает.