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

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

ИЗМЕНИТЬ:

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

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


person claws    schedule 19.03.2010    source источник
comment
Это зависит от архитектуры и не обязательно зависит от ОС.   -  person Nathan Osman    schedule 20.03.2010


Ответы (4)


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

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

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

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

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

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

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

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

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

person Omar Alrubaiyan    schedule 20.03.2010
comment
Отключены ли прерывания при выполнении обработчика прерываний? Или прерывания с более высоким приоритетом могут прерывать уже работающий обработчик прерываний? Может ли быть переключение контекста во время выполнения обработчика прерывания? - person Sharat Chandra; 19.03.2012
comment
Просто для уточнения: вы имеете в виду операционную систему, когда вы пишете, что система проверяет таблицу дескрипторов прерываний? - person Martin Thoma; 05.03.2013

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

person Carl Norum    schedule 19.03.2010
comment
Итак, это две единственные ситуации, когда процессор переходит в режим ядра? - person claws; 19.03.2010
comment
@claws, это полностью зависит от процессора, операционной системы и реализации. - person Carl Norum; 19.03.2010
comment
Комментарий о системных вызовах, происходящих через прерывание, несколько устарел. Старый Linux использовал прерывание 0x80 для переключения в режим ядра при системном вызове. Но с более новыми процессорами (где новым является все, что угодно › Pentium 2) и ядрами Linux произошел переход к использованию средства быстрого системного вызова, предоставляемого через инструкции sysenter, sysexit. Ознакомьтесь с articles.manugarg.com/systemcallinlinux2_6.html. - person Jasmeet; 04.05.2010
comment
@Jasmeet, это по-прежнему семантически эквивалентно программному прерыванию, даже если оно не имеет такого же названия на жаргоне Intel. - person Carl Norum; 04.05.2010

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

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

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

person Paul    schedule 18.11.2012

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

person Jens Björnhager    schedule 19.03.2010