В чем разница между стеком ядра и пользовательским стеком? - PullRequest
9 голосов
/ 09 февраля 2011

Зачем использовать два разных стека в одной программе?Как trap меняет текущий стек программы из пользовательского стека в стек ядра?Как он возвращается в стек пользователя после завершения системного вызова?

Есть ли у каждого процесса ядро ​​и стек пользователя?

Ответы [ 7 ]

11 голосов
/ 10 февраля 2011

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

Как «перехват изменений в стеке» на самом деле довольно прост.

Процессор изменяет процессы или «режимы» в результате прерывания.Прерывание может происходить по многим различным причинам - происходит сбой (например, ошибка или сбой страницы), или физическое аппаратное прерывание (например, с устройства) - или прерывание по таймеру (которое происходит, например, когда процесс использовалвсе это отведено времени ЦП ").

В любом случае - когда вызывается это прерывание, регистры ЦП сохраняются в стеке - все регистры - включая сам указатель стека.

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

Это называется «Переключение контекста».

Я упрощаю несколько вещей - например, как контекст управления памятью сохраняется и восстанавливается, но это идея. Это простосохранение и восстановление регистров в ответ на прерывание, включая регистр «указатель стека».

8 голосов
/ 16 февраля 2012

Есть 2 стека, потому что есть 2 контекста выполнения процессора.Стек режима пользователя будет обслуживать вашу программу в отношении создания кадров стека для функций, локальных переменных, адресов возврата и т. Д. Когда ЦП переключает контекст в режим ядра, например, во время выполнения системного вызова, ему необходим доступ к памяти ядра и структурам данныхи поэтому переключается на использование своего стека ядра.И да, Unix, я полагаю, использует стек ядра для каждого процесса.

4 голосов
/ 09 февраля 2011

зачем использовать два разных стека в одной программе

Я никогда не слышал ни о ядре, ни о стеке пользователя в терминах одного процесса, хотя это может быть очень распространенным явлением. Здесь обсуждается .

Стек ядра должен быть изолирован от стека пользовательского режима. В противном случае код пользовательского режима может повредить стек ядра и вызвать сбой ядра.

как trap меняет текущий стек программы со стека пользователя на стек ядра

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

имеет ли каждый процесс ядро ​​и пользовательский стек

Полагаю, это зависит от дизайна операционной системы, хотя, возможно, оно довольно универсально. Ссылки, которые я привел выше, указывают, что Linux использует два (или более) стека на процесс. Я не слышал о Windows, использующей стек для режима ядра для каждого процесса.

3 голосов
/ 03 марта 2015

Я изучаю ОС в университете, и наш проект основан на OS / 161 , построенном Гарвардом. Поэтому мой ответ основан на этой ОС.

В OS / 161 каждый поток имеет 2 стека - один для пользователя / прикладной программы, один для программы ядра.

1. Зачем нужно использовать два разных стека в одной программе?

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

2. Как trap меняет текущий стек программы со стека пользователя на стек ядра?

в OS / 161 ловушка используется для передачи из прикладной программы в ядро. Существует три механизма, которые могут вызывать ловушку: Системные вызовы, исключения и прерывания . Кадр ловушки в стеке ядра используется для сохранения текущего контекста потока.

Ниже приведен подробный процесс (из конспекта UWaterloo CS350 ):

  • Когда происходит один из вышеуказанных механизмов, аппаратное обеспечение переключает ЦП. в привилегированном режиме и передает управление в заранее определенное место, в котором должен находиться обработчик ядра.

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

  • Непосредственно перед завершением работы обработчика ядра он восстанавливает контекст потока приложения из рамки прерывания перед возвратом контроль над приложением.

3. Как он возвращается в стек пользователя после завершения системного вызова?

Процесс выше ясно объясняет и этот вопрос.

3 голосов
/ 09 февраля 2011

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

0 голосов
/ 16 ноября 2015

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

0 голосов
/ 16 февраля 2011

Это зависит от операционной системы. Причиной этого является базовая безопасность операционной системы. Это благодаря тщательному дизайну самой операционной системы. Например, некоторые процессоры имеют стеки Kernel, Executive, Supervisor и User.

Renee

...