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