2016-08-22 2 views
-1

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

Вопрос в том, где процессор сохраняет адрес текущих действий, чтобы возобновить его после выполнения обработчика прерываний?

+3

Обычно это стек, но это зависит от архитектуры, о которой вы говорите. –

ответ

0

Сильно зависит от архитектуры. Несколько подходов приходят на ум (я уверен, что есть больше):

  • Нажимные основные регистры в текущем стеке (например: Instruction Pointer), а затем перейти к обработчику исключений. Затем обработчик исключений отвечает за сохранение любых других регистров, которые ему нужно использовать. Я считаю, что это подход, выполняемый процессорами x86. Я просто не уверен, что он по умолчанию перебрасывает все регистры или основные.
  • ЦПУ имеет различный набор регистров в зависимости от режима ЦП. (например: Режим пользователя, Режим прерывания). По сути, когда происходит прерывание, он начинает использовать другой набор регистров. Например, ARM cpus делают это, хотя они не используют полный набор регистров в режиме CPU. См. https://en.wikipedia.org/wiki/ARM_architecture#Registers
  • Некоторые древние cpus имеют набор регистров в самой ОЗУ, поэтому контекст переключения просто изменяет местоположение регистра, установленного в памяти. См. https://en.wikipedia.org/wiki/Texas_Instruments_TMS9900#Architecture. Такой подход невозможен, если ОЗУ работает медленнее, чем сам ЦП. Но это все еще возможно для имитируемых компьютеров. Например, мой хобби-проект (полностью имитируемый компьютер) использует этот подход. Ядро настраивает другой набор регистров для каждого приложения. https://bitbucket.org/ruifig/g4devkit. Хотя в какой-то момент я могу перейти на другое решение.
+0

«ОЗУ - путь медленнее, чем сам процессор» - это глупость для небольших маломощных микроконтроллеров. – Olaf

+0

@ Олаф Да, я забыл об одном случае. Спасибо :) Знайте о любых современных маломощных процессорах, которые это делают? – RuiFig

+0

Есть еще варианты, что. Вопрос слишком широк, чтобы быть на тему здесь! «Знайте о любых современных маломощных процессорах, которые это делают» - Да! «Современный» - это бессмысленный критерий. До сих пор существует большое количество производных 8051. В общем, они все еще могут быть большинством проданных единиц. – Olaf

1

Это зависит от архитектуры, которую вы имеете в виду. Но обычно сам процессор подталкивает текущий счетчик программ в момент прерывания в текущий стек. Возврат прерывания затем извлекает информацию о штабелированном ПК и возвращается к нормальному потоку программы. Например. архитектуры, которые выталкивают ПК в стек: Atmel AVR, ARM Cortex-M, PowerPC.

Atmel AVR: http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_RETI.html

ARM Cortex-M: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Babefdjc.html

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