Какой адрес возврата помещается в стек, если прерывание происходит во время выполнения последней инструкции программы? - PullRequest
0 голосов
/ 11 сентября 2018

Компьютерная организация и архитектура

Когда происходит прерывание во время выполнения программы, тогда ЦПУ выполняет эту инструкцию и сохраняет адрес следующей инструкции в стеке и обрабатывает прерывание, а затем снова возобновляет выполнение инструкций предыдущих программ с помощью стека

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

1 Ответ

0 голосов
/ 11 сентября 2018

Не существует последней инструкции программы.

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

В случае выполнения программывнутри операционной системы, когда программа завершает свою работу, она должна уведомить ОС о таком состоянии (это может быть так же просто, как сделать возврат), чтобы она могла «указать» ЦПУ на другую программу.
Сама ОС никогда не заканчивается, онаничего не нужно делать, запланирована фиктивная задача - обычно та, которая останавливает процессор до следующего прерывания.
Существуют ситуации, когда прерывание не должно происходить (например, в начале обработки другого прерывания) - в этом случаеони отключены.

Проще говоря, в худшем случае программа должнавращение в цикле (while (1);), чтобы процессор не извлекался за конец кода.


На уровне архитектуры прерывания обслуживаются на границах инструкций, то есть после окончания «последней» инструкции и до «следующей».
Некоторые архитектуры могут не реализовывать это, но это совсем другоешарик воска.
Таким образом, когда подается прерывание, состояние ЦП всегда архитектурно определяется.
Поскольку прерывание не может быть обработано во время инструкции ret вызова, а скорее до или после возвратаадрес либо указывает на сам ret (если прерывание подается до), либо на инструкцию после вызова (если это сервер после).

...