как регистры сохраняются, когда процесс прерывается? - PullRequest
0 голосов
/ 13 июня 2011

это беспокоило меня весь день.Когда программа настраивается на вызов функции при получении определенного прерывания, я знаю, что регистры помещаются в стек при прерывании программы, но я не могу понять: как регистры выходят изстек?Я знаю, что компилятор не знает, является ли функция обработчиком прерываний, и он не может знать, сколько аргументов прерывание передало функции.Так как же он снимает регистры?

1 Ответ

1 голос
/ 13 июня 2011

Это зависит от компилятора, ОС и процессора.

Для низкоуровневых встроенных компонентов, где ISR может вызываться непосредственно в ответ на прерывание, компилятор обычно имеет некоторое расширение к языку(обычно C или C ++), который помечает данную подпрограмму как ISR, и регистры будут сохраняться и восстанавливаться в начале и в конце такой подпрограммы.[1]

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


[1] Например, компилятор Keil 8051 C:

void Some_ISR(void) interrupt 0 // this routine will get called in response to interrupt 0
{
    // compiler generates preamble to save registers

    // ISR code goes here

    // compiler generates code to restore registers and
    // do any other special end-of-ISR stuff
}
...