Возврат из режима ядра в режим пользователя - PullRequest
2 голосов
/ 02 апреля 2012

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

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

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

trapret popping the values off the kernel stack

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

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

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

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

Trap Frame during a transition from user mode to kernel mode

1 Ответ

2 голосов
/ 02 апреля 2012

iret восстанавливает все это

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


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

  1. Выполняет проверку привилегий.
  2. Восстанавливает регистры CS и EIP до их значений до прерывания или исключения.
  3. Восстанавливает регистр EFLAGS.
  4. Восстанавливает регистры SS и ESP до их значений до прерывания или исключения, что приводит к переключению стека обратно в стек прерванной процедуры.
  5. Возобновляет выполнение прерванной процедуры.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...