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

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

EDIT:

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

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

Ответы

Ответ 1

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

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

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

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

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

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

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

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

Надеюсь, что помогает:)

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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