При запуске системного вызова, как сохраняются пользовательские режимы ss и esp, например. в линуксе?

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

Вопрос в том, что для обнаружения стека режима ядра сначала нужно загрузить ss/esp с соответствующими значениями режима ядра. Теперь мне кажется, что пользовательский режим ss/esp был сброшен. Тогда как оборудование/система получает пользовательский режим ss/esp?

Сохраняются ли пользовательские ss и esp во временных местах? Или операция поддерживается схемой x86?


person Infinite    schedule 17.01.2011    source источник


Ответы (1)


Подумайте о том, что происходит с указателем инструкций. Очевидно, что где-то там должна быть какая-то аппаратная поддержка.

Отложив в сторону современные методы «быстрых системных вызовов» (я вернусь к этому позже), обратите внимание, что системный вызов запрашивается просто путем выдачи определенного программного прерывания с определенными регистрами процессора, настроенными соответствующим образом. Итак, что происходит, зависит от аппаратного прерывания в процессоре.

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

Теперь, если мы посмотрим на «быстрые системные вызовы» (инструкция SYSENTER), мы заметим, что она требует, чтобы некоторые регистры состояния машины были уже настроены, и она не сохраняет состояние (это часть что делает это быстрее, чем выдача прерывания). Вызывающий код отвечает за размещение в незатертых регистрах данных, необходимых ядру для выполнения системного вызова, и данных, необходимых ему для возврата в исходное состояние.

person Anon.    schedule 17.01.2011
comment
Это имеет смысл для меня. Я думаю, что для CS/EIP также должна быть некоторая аппаратная поддержка. Когда происходит какая-либо ошибка, текущая CS/EIP уже указывает на следующую инструкцию, в то время как исходную ошибочную CS/EIP необходимо извлечь и сохранить в стеке режима ядра, чтобы повторно выполнить ту же инструкцию после обработки ошибки. Чтобы получить исходный CS/EIP, также должна быть какая-то аппаратная поддержка, верно? - person Infinite; 17.01.2011
comment
@SetTimer: я не совсем уверен, как это все работает под капотом, но да, вполне вероятно, что EIP передается по конвейеру вместе с другими необходимыми данными для инструкции. Я сомневаюсь, что CS будет обрабатываться таким же образом - для его передачи потребуется много транзисторов, и это не очень распространенный случай его модификации, поэтому я предполагаю, что изменение CS просто вместо этого останавливает конвейер, похоже на неверное предсказание ветвления. Но современные процессоры очень сложные и я точно не знаю ни как. - person Anon.; 17.01.2011