Я немного запутался в понимании переключения режима в ядре Unix. Я даю здесь свое понимание и открываю его для обсуждения/исправления.
При переходе из пользовательского режима в режим ядра процессор переключается между стеком для каждого процесса-пользователя и стеком для каждого процесса-ядра. Затем селектор сегмента стека для каждого процесса и указатель стека сохраняются в стеке ядра, а затем указатель инструкции eip
(адрес возврата в пользовательском режиме) и другие аппаратные регистры помещаются в стек ядра.
Когда ядру нужно вернуться в пользовательский режим, код trapret
извлекает все значения, хранящиеся в стеке ядра, обратно в аппаратные регистры.
Но когда iret
извлекает eip из стека ядра, следующая инструкция, которая должна быть выполнена, — это адрес возврата в пользовательском режиме.
Это происходит без полного извлечения других значений из стека ядра.
Как восстанавливаются остальные значения (%cs, %eflags, %esp, %ss
)?
Как указатель пользовательского стека, присутствующий в стеке ядра, возвращается к %esp?