Ответ 1
Вам нужно понять, что контекст потока/процесса имеет несколько частей, один из которых напрямую связан с выполнением и хранится в ЦП и некоторые системные таблицы в памяти, которые использует процессор (например, таблицы страниц), а другой, который необходим для ОС, для ведения бухгалтерского учета (подумайте о различных идентификаторах, ручках, специальных разрешениях для ОС, сетевых подключениях и т.д.).
Полный контекстный переключатель включал бы замену обоих из них, старый текущий поток/процесс уходит на некоторое время, а новый текущий поток/процесс заходит некоторое время. Это суть планирования потоков/процессов.
Теперь системные вызовы очень разные w.r.t. друг друга.
Рассмотрим что-то простое, например, системный вызов для запроса текущей даты и времени. CPU переключается с режима пользователя на ядро, сохраняя значения регистра пользовательского режима, выполняет некоторый код ядра для получения необходимых данных, сохраняет его либо в памяти, либо регистрирует, что вызывающий может получить доступ, восстанавливает значения регистра пользовательского режима и возвращается. Здесь не так много контекста, только то, что необходимо для перехода между режимами, пользователем и ядром.
Рассмотрим теперь системный вызов, который включает блокировку вызывающего абонента до некоторого события или доступности данных. Примерами таких системных вызовов могут быть манипулирование мьютексами и файлами чтения. В этом случае ядро вынужден сохранить полный контекст вызывающего, пометить его как заблокированный, чтобы планировщик не смог запустить его до тех пор, пока это событие или данные не прибудет, и загрузите контекст другого готового потока/процесса, чтобы он мог запускаться.
То, как системные вызовы связаны с коммутаторами контекста.
Ядро, выполняемое в контексте пользователя или процесса, означает, что всякий раз, когда ядро работает от имени определенного процесса или пользователя, он должен учитывать этот контекст пользователя/процесса, например. текущий идентификатор процесса/потока/пользователя, текущий каталог, локаль, права доступа для различных ресурсов (например, файлы), все это, что может быть различным между разными процессами/потоками/пользователями.
Если процессы имеют отдельные адресные пространства, адресные пространства также являются частью контекста процесса. Таким образом, когда ядру необходимо получить доступ к памяти процесса (для чтения/записи данных файла или сетевых пакетов), он должен иметь доступ к адресному пространству процесса, IOW, он должен быть в его контексте (он не что ядро должно загружать полный контекст только для доступа к памяти в определенном адресном пространстве).
Это полезно?