CPU переключается из режима пользователя в режим ядра: что именно он делает? Как это делает этот переход? - PullRequest
24 голосов
/ 19 марта 2010

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

EDIT:

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

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

Ответы [ 4 ]

29 голосов
/ 21 марта 2010

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

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

  • Ошибка (например, ошибка страницы или другое исключение, вызванное выполнением инструкции)
  • Прерывание (например, прерывание клавиатуры или окончание ввода / вывода)
  • Trap (например, системный вызов)

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

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

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

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

Вы сейчас в режиме ядра.

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

4 голосов
/ 19 марта 2010

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

3 голосов
/ 18 ноября 2012

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

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

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

1 голос
/ 20 марта 2010

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

...