Для чего используется стек ядра?

ниже приведено описание, которое я прочитал о переключении контекста между процессом A и процессом B. Я не понимаю, для чего используется стек ядра. Предполагается, что существует стек ядра для каждого процесса. А описание я читал говорит о сохранении регистров на стек ядра и также сохранение регистров в структуре процесса А. То, что именно в момент сохранения регистров и стека ядра и процесс структура и для чего нужен как?

переключение контекста в принципе прост: все ОС надо сохранить несколько значений регистра для текущего процесса (на его стек ядра, например) и восстановить несколько на процесс, который скоро будет выполнен (из его стека ядра). Таким образом, Таким образом, ОС гарантирует, что когда инструкция return-from-trap наконец вместо того чтобы вернуться к запущенному процессу, система возобновляет выполнение другого процесс...

процесс a выполняется, а затем прерывается прерыванием таймера. Аппаратное обеспечение сохраняет свои регистры (в свой стек ядра) и входит ядро (переход в режим ядра). В таймер обработчик прерываний , ОС решает переключиться с запуска процесса A на процесс B. При этом point, он вызывает процедуру switch (), которая тщательно сохраняет ток зарегистрируйте значения (в структуру процесса A), восстанавливает регистры процесса B (из его процесса запись структуры), а затем переключает контексты, в частности, изменяя указатель стека для использования Стек ядра B (а не A). Наконец, ОС возвращает-из-ловушка, который восстанавливает регистры B и запускает его.

2 ответов


у меня есть несогласие со вторым пунктом.

процесс a выполняется, а затем прерывается прерыванием таймера. Аппаратное обеспечение сохраняет свои регистры (в своем стеке ядра) и входит в ядро (переключение в режим ядра).

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

это описание не предполагает никаких изменений в процессе.

Если дескриптор прерывания решает изменить процесс, он сохраняет текущее состояние регистра ("контекст процесса" --большинство процессоров имеют одну инструкцию для этого. В Intel land вам может потребоваться использовать несколько инструкций), затем выполняет другую инструкцию для загрузки контекста процесса нового процесса.

чтобы ответить на ваш вопрос заголовка "для чего используется стек ядра?"он используется, когда процессор находится в режиме ядра. Если ядро не имеет стека, защищенного от доступа пользователей, целостность системы может быть нарушена. Этот стека ядра, как правило, очень мала.

чтобы ответить на второй вопрос: "в чем именно смысл сохранения регистров как в стеке ядра, так и в структуре процесса, и почему это необходимо?"

они служат двум различным целям. Сохраненные регистры в стеке ядра используются для выхода из режима ядра. Блок context process сохраняет весь набор регистров для изменения процессов.

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

редактирование для ответа на дополнительные вопросы:

Если обработчику прерываний необходимо использовать регистр, не сохраненный процессором автоматически прерыванием, он помещает их в стек ядра при входе и отключает их при выходе. Обработчик прерываний должен явно сохранять и восстанавливать любые [общие] регистры, которые он использует. Контекстный блок Process не трогается для этого.

блок контекста процесса изменяется только как часть фактического переключателя контекста.

пример:

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

  1. прерывание.

оборудование выталкивает ПК, SP и PS в стек, загружает SP с адресом стека режима ядра и ПК из обработчика прерываний (из таблицы диспетчеризации процессора).

  1. обработчик прерываний получает называемый.

автор обработчика решает, что он собирается к нам R0-R3. Итак, первые строки обработчика имеют:

Push R0  ; on to the kernel mode stack
Push R1
Push R2
Push R3
  1. обработчик прерываний делает все, что он хочет сделать.

  2. очистка

автор обработчика прерываний должен сделать:

Pop R3
Pop R2
Pop R1
Pop R0 
REI      ; Whatever the system's return from interrupt or exception instruction is.
  1. аппаратное обеспечение берет на себя

восстанавливает PS, PC и SP из режима ядра стек, затем возобновляет выполнение там, где он был до прерывания.

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

обработчик прерываний не смешивается с процессом контекстный блок, если он не изменяет процессы.


трудно говорить в общих чертах о том, как работает ОС "под капотом", потому что это зависит от того, как работает оборудование. Кроме того, терминология не очень стандартизирована.

Я предполагаю, что под "записью структуры процесса" автор имеет в виду то, что обычно известно как "контекст" процесса, и что содержит копию каждого регистра. Невозможно, чтобы код прерывания немедленно сохранял регистры в этой структуре, потому что он должен был бы использовать (и поэтому измените) регистры при этом. Вот почему он должен сохранить несколько регистров, достаточно, чтобы он мог выполнить работу, где-то сразу же доступный, например, где указатель стека указывает, который писатель называет "стеком ядра".

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