Процессор переключается из пользовательского режима в режим ядра:Что именно он делает?Как происходит этот переход?
-
21-09-2019 - |
Вопрос
Процессор Переключение из пользовательского режима в режим ядра:Что именно он делает?Как происходит этот переход?
РЕДАКТИРОВАТЬ:
Даже если это зависит от архитектуры, пожалуйста, дайте мне ответ.Архитектура зависит от вас.Расскажите мне об архитектуре, о которой вы знаете.
Я хочу получить представление о том, что все это будет включать в себя.
Решение
Примечание:в основном это относится к архитектуре x86.Вот несколько упрощенное объяснение.
Переход обычно вызывается одним из следующих факторов:
- Неисправность (напр.ошибка страницы или какое-либо другое исключение, вызванное выполнением инструкции)
- Прерывание (например.прерывание клавиатуры или завершение ввода-вывода)
- Ловушка (напр.системный вызов)
Обычно происходит следующее: система проверяет таблицу дескрипторов прерываний (IDT).Каждое исключение (прерывание, ошибка и т. д.) имеет связанный с ним номер, который используется для индексации в этой таблице.
Из этой таблицы ЦП может определить, какой обработчик прерываний будет запускаться.
В рамках перехода вступают в силу следующие изменения (в целом):
- Переключиться на стек ядра
- EFLAGS сохранены
- Селектор сегмента кода и EIP сохранены.
- селектор сегмента стека и указатель стека сохраняются.
- Начать выполнение обработчика прерываний
- Регистры общего назначения сохраняются (работа обработчика)
- Селекторы сегментов заменены на селекторы ядра (работа обработчика)
Теперь вы находитесь в режиме ядра.
Надеюсь, это поможет :)
Другие советы
Это зависит от системы, но обычный механизм заключается в том, что какая-то пользовательская операция вызывает программное прерывание.Это прерывание заставляет процессор переключать режимы и переходить к коду ядра, которое затем проверяет, что программа пыталась сделать (системный вызов?), а затем выполняет запрошенное действие и возвращается к коду пользовательского режима.Другие механизмы, помимо программного прерывания, также могут вызвать переход;например, в системе с вытесняющей многозадачностью прерывание таймера может вызвать запуск планировщика.
Насколько я понимаю, любая программа, чьи сегментные регистры имеют два младших бита, равных нулю, будет работать в режиме ядра, в то время как любая программа, чьи сегментные регистры имеют два младших бита = 1, будет работать в пользовательском режиме.Фактически, два младших разряда регистраторов сегмента определяют уровень привилегий (от 0 (самый высокий) до 3 (самый низкий)).
Итак, чтобы программа работала в режиме ядра, вам необходимо настроить регистры сегмента на шестнадцатеричные значения 0010 (я полагаю).Я не уверен, как можно разместить программу в этом пространстве памяти, не перезаписывая что-то еще - другими словами, как компоновщик гарантирует это?Кроме того, если вы хотите вызвать код режима ядра из кода пользовательского режима, вам нужно выяснить, как передавать параметры — они не используют одно и то же пространство памяти, поэтому не могут передавать данные по ссылке на память.Я думаю, вам придется передать это в регистрах.
Если кто-нибудь сможет восполнить пробелы в вышеизложенном, буду очень признателен.
В Windows при выполнении системного вызова подпрограммы библиотеки вызывают точку входа ядра, находящуюся в адресном пространстве операционной системы.Он, в свою очередь, переводит ЦП в режим супервизора, выполняя специальную для этой цели инструкцию, например: системный центр.По сути, он устанавливает бит в регистре флагов.Это позволяет ОС использовать привилегированные инструкции.