Существует один «стек ядра» на процессор.Существует один «пользовательский стек» для каждого процесса, хотя каждый поток имеет свой собственный стек, включая потоки как пользователя, так и ядра.
Как «перехват изменений в стеке» на самом деле довольно прост.
Процессор изменяет процессы или «режимы» в результате прерывания.Прерывание может происходить по многим различным причинам - происходит сбой (например, ошибка или сбой страницы), или физическое аппаратное прерывание (например, с устройства) - или прерывание по таймеру (которое происходит, например, когда процесс использовалвсе это отведено времени ЦП ").
В любом случае - когда вызывается это прерывание, регистры ЦП сохраняются в стеке - все регистры - включая сам указатель стека.
Обычнозатем вызывается «планировщик». Затем планировщик выбирает другой процесс для запуска - восстанавливает все свои сохраненные регистры , включая указатель стека , и продолжает выполнение с того места, где он остановился (сохраненный в return-указатель адреса).
Это называется «Переключение контекста».
Я упрощаю несколько вещей - например, как контекст управления памятью сохраняется и восстанавливается, но это идея. Это простосохранение и восстановление регистров в ответ на прерывание, включая регистр «указатель стека».