Обработчики прерываний и инструкция syscall
(которая является оптимизированным программным прерыванием) автоматически изменяют уровень привилегий (это аппаратная функция, упомянутое вами различие между кольцом 0 и кольцом 3) вместе с заменой другого состояния процессора (указатель инструкции, указатель стека и т. д.).Предыдущее состояние, конечно, сохраняется, чтобы его можно было восстановить после завершения прерывания.
Код ядра должен быть крайне осторожным, чтобы не доверять вводу из пользовательского режима.Один из способов справиться с этим - не допустить, чтобы пользовательский режим передавал указатели, которые будут разыменовываться в режиме ядра, а вместо этого - РУЧКИ, которые ищутся в таблице в памяти режима ядра, которые не могут быть изменены пользовательским режимом ввсе.Информация о возможностях хранится в таблице HANDLE и связанных структурах данных ядра, например, WriteFile
знает, что происходит сбой, если файловый объект открыт для доступа только для чтения.
Переключатель задач поддерживает информациюна котором запущен процесс, чтобы системные вызовы, выполняющие проверки безопасности, такие как CreateFile
, могли проверять учетную запись пользователя текущего процесса и проверять ее по файлу ACL.Этот идентификатор процесса и токен пользователя снова сохраняются в памяти, доступной только ядру.
Таблицы страниц MMU используются для предотвращения изменения памяти ядра в пользовательском режиме - как правило, отображение страниц вообще не выполняется.;есть также биты доступа к странице (чтение, запись, выполнение), которые принудительно устанавливаются аппаратным обеспечением MMU.Код ядра использует другую таблицу страниц, перестановка происходит как часть инструкции syscall
и / или активации прерывания.