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