Куда вернуться с прерывания - PullRequest
2 голосов
/ 28 февраля 2012

Я читал (и изучал) об обработке прерываний.
Я всегда не понимаю, как мы узнаем, куда вернуться (PC / IP) из обработчика прерываний.
Как я понимаю:

  1. Прерывание вызвано устройством (скажем, клавиатурой)
  2. Соответствующий обработчик вызывается - под запущенным процессом. То есть переключение контекста на ОС не выполняется.
  3. Обработчик прерываний завершает работу и передает управление запущенному приложению.

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

Буду признателен за любое объяснение, в том числе однострочники, которые просто указывают на хороший pdf / ppt, посвященный именно этому вопросу. [Я обычно имею в виду вышеописанный процесс в коде Linux и C - но все хорошие ответы приветствуются]

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

Это довольно зависит от архитектуры.

На процессорах Intel адрес возврата прерывания помещается в стек при возникновении прерывания.Вы бы использовали инструкцию iret для возврата из контекста прерывания.

В ARM прерывание вызывает изменение режима процессора (например, на режим INT, FIQ или SVC), сохраняя текущий CPSR (текущий регистр состояния программы) в SPSR(сохраненный регистр состояния программы), помещение текущего адреса выполнения в LR нового режима (регистр связи), а затем переход к соответствующему вектору прерывания.Поэтому возврат из прерывания осуществляется путем перемещения SPSR в CPSR и последующего перехода к адресу, сохраненному в LR - обычно выполняется за один шаг с помощью инструкции subs или movs:

movs pc, lr
1 голос
/ 28 февраля 2012

Когда инициируется прерывание, ЦПУ помещает в стек несколько регистров, включая указатель инструкций (EIP) кода, который выполнялся до прерывания.Вы можете поставить iret и конец вашего ISR, чтобы вытолкнуть эти значения, и восстановить EIP (а также CS, EFLAGS, SS и ESP).

Кстати, прерывания не обязательно инициируютсяустройства.В Linux и DOS программы пользовательского пространства используют прерывания (через int) для выполнения системных вызовов.Некоторый код ядра использует прерывания, например, намеренно тройной сбой для принудительного завершения работы.

0 голосов
/ 28 февраля 2012

Механизм запуска прерываний в ЦПУ помещает адрес возврата в стек (среди прочего).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...