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