Процессор переключается из пользовательского режима в режим ядра:Что именно он делает?Как происходит этот переход?

StackOverflow https://stackoverflow.com/questions/2479118

Вопрос

Процессор Переключение из пользовательского режима в режим ядра:Что именно он делает?Как происходит этот переход?

РЕДАКТИРОВАТЬ:

Даже если это зависит от архитектуры, пожалуйста, дайте мне ответ.Архитектура зависит от вас.Расскажите мне об архитектуре, о которой вы знаете.

Я хочу получить представление о том, что все это будет включать в себя.

Это было полезно?

Решение

Примечание:в основном это относится к архитектуре x86.Вот несколько упрощенное объяснение.

Переход обычно вызывается одним из следующих факторов:

  • Неисправность (напр.ошибка страницы или какое-либо другое исключение, вызванное выполнением инструкции)
  • Прерывание (например.прерывание клавиатуры или завершение ввода-вывода)
  • Ловушка (напр.системный вызов)

Обычно происходит следующее: система проверяет таблицу дескрипторов прерываний (IDT).Каждое исключение (прерывание, ошибка и т. д.) имеет связанный с ним номер, который используется для индексации в этой таблице.

Из этой таблицы ЦП может определить, какой обработчик прерываний будет запускаться.

В рамках перехода вступают в силу следующие изменения (в целом):

  • Переключиться на стек ядра
  • EFLAGS сохранены
  • Селектор сегмента кода и EIP сохранены.
  • селектор сегмента стека и указатель стека сохраняются.
  • Начать выполнение обработчика прерываний
  • Регистры общего назначения сохраняются (работа обработчика)
  • Селекторы сегментов заменены на селекторы ядра (работа обработчика)

Теперь вы находитесь в режиме ядра.

Надеюсь, это поможет :)

Другие советы

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

Насколько я понимаю, любая программа, чьи сегментные регистры имеют два младших бита, равных нулю, будет работать в режиме ядра, в то время как любая программа, чьи сегментные регистры имеют два младших бита = 1, будет работать в пользовательском режиме.Фактически, два младших разряда регистраторов сегмента определяют уровень привилегий (от 0 (самый высокий) до 3 (самый низкий)).

Итак, чтобы программа работала в режиме ядра, вам необходимо настроить регистры сегмента на шестнадцатеричные значения 0010 (я полагаю).Я не уверен, как можно разместить программу в этом пространстве памяти, не перезаписывая что-то еще - другими словами, как компоновщик гарантирует это?Кроме того, если вы хотите вызвать код режима ядра из кода пользовательского режима, вам нужно выяснить, как передавать параметры — они не используют одно и то же пространство памяти, поэтому не могут передавать данные по ссылке на память.Я думаю, вам придется передать это в регистрах.

Если кто-нибудь сможет восполнить пробелы в вышеизложенном, буду очень признателен.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top