Возврат из режима ядра в пользовательский режим

Я немного запутался в понимании переключения режима в ядре Unix. Я даю здесь свое понимание и открываю его для обсуждения/исправления.

При переходе из пользовательского режима в режим ядра процессор переключается между стеком для каждого процесса-пользователя и стеком для каждого процесса-ядра. Затем селектор сегмента стека для каждого процесса и указатель стека сохраняются в стеке ядра, а затем указатель инструкции eip (адрес возврата в пользовательском режиме) и другие аппаратные регистры помещаются в стек ядра.

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

trapret извлекает значения из стека ядра

Но когда iret извлекает eip из стека ядра, следующая инструкция, которая должна быть выполнена, — это адрес возврата в пользовательском режиме.

Это происходит без полного извлечения других значений из стека ядра.

Как восстанавливаются остальные значения (%cs, %eflags, %esp, %ss)?

Как указатель пользовательского стека, присутствующий в стеке ядра, возвращается к %esp?

Кадр-ловушка при переходе из пользовательского режима в режим ядра


person Sharat Chandra    schedule 01.04.2012    source источник


Ответы (1)


iret восстанавливает все это добро

Инструкция iret довольно сложна. Процитируем руководство по архитектуре Intel:


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

  1. Выполняет проверку привилегий.
  2. Восстанавливает регистры CS и EIP до их значений до прерывания или исключения.
  3. Восстанавливает регистр EFLAGS.
  4. Восстанавливает значения регистров SS и ESP до прерывания или исключения, что приводит к переключению стека обратно на стек прерванной процедуры.
  5. Возобновляет выполнение прерванной процедуры.
person DigitalRoss    schedule 01.04.2012
comment
Также опубликовано еще одно сомнение здесь... stackoverflow.com/questions/9969922/ Можете ли вы ответить мне на это? - person Sharat Chandra; 02.04.2012