2

В чем разница между режимом пользователя и режимом ядра? зачем нужен контекстный переключатель при переключении между 2?

3 ответа3

1

Мой ответ относится к Linux, потому что это то, что я знаю, но оно должно быть одинаково правильным для большинства, если не для всех версий Unix.

В пользовательском режиме выполняются все процессы, которые не являются частью ядра (иначе говоря, «неядерные процессы»). По умолчанию в пользовательском режиме процесс может напрямую обращаться только к собственной памяти. Это необходимо для защиты процессов друг от друга и для предотвращения ошибки в одном процессе, вызывающей сбой другого процесса. Это также помогает обеспечить безопасность, поскольку процесс с низким уровнем привилегий не может напрямую обращаться к памяти процесса, выполняющегося от имени другого пользователя, который может содержать конфиденциальные данные, такие как данные кредитной карты.

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

Переключение между пользовательским режимом и режимом ядра может потребовать переключения контекста, но только из-за давнего соглашения, а не потому, что это абсолютно необходимо. Источник: http://en.wikipedia.org/wiki/Context_switch#User_and_kernel_mode_switching

1

Предполагая архитектуру x86:

Пользовательский режим:

  • Схема виртуальной памяти действует. В пользовательском режиме адреса памяти сопоставляются с физическими адресами через таблицы страниц. Таким образом, когда программа пользовательского режима обращается к памяти, например, в ячейке памяти 0x0001000, она, вероятно, перенаправляется через механизм виртуальной памяти на совершенно другой адрес. Это также контролирует доступ к оборудованию, доступ к которому осуществляется через ячейки памяти, такие как ОЗУ, такие как регистры APIC, видеопамять и т.д. Вот почему процесс пользовательского режима не может "вырваться из своей оболочки" и изменить места в памяти, где живут другие программы.

  • Действует механизм привилегий ввода / вывода. Это влияет на определенное оборудование, которое использует «порты ввода / вывода» (не имеет отношения к портам TCP / IP), например устаревшее оборудование PIC и PIT, память CMOS и т.д. Пользовательский режим может получать доступ только к портам ввода / вывода, разрешенным "битовой картой IOPL", не может отключать прерывания и не может изменять IOPL.

  • Привилегированные инструкции процессора вызовут исключение, если выполнятся. Это включает в себя инструкции по настройке таблиц страниц и другие вещи.

Режим ядра:

  • Схема виртуальной памяти не действует. Когда процессор читает память, адрес, который он запрашивает, является адресом, который он получает. Другими словами, это «квартира».

Да, процесс в режиме ядра может полностью перезаписать другие процессы или код в памяти, например критические структуры ядра или драйверы устройств.

  • Механизм привилегий ввода / вывода не действует. CPU может получить доступ к любому порту ввода / вывода без ограничений и установить IOPL для пользовательского режима.

  • Все привилегированные инструкции могут быть выполнены без исключения.

"Переключение контекста" необходимо, потому что всякий раз, когда ЦП x86 запускает программу, в ее регистрах присутствует значительная часть текущего состояния этой программы в данный момент, в дополнение к областям памяти, которые она может использовать для переменных и временного хранения.

Итак, если мы хотим, чтобы ЦП внезапно перешел в другое место, а затем вернулся к тому, что делал раньше, необходимо сохранить все регистры ЦП, чтобы они могли быть восстановлены до перехода назад.

0

Ядро отвечает за управление ресурсами системы (планирование, управление памятью, работа в сети и т.д.). Ядро работает в защищенном контексте, называемом кольцом 0, чтобы предотвратить его модификацию непривилегированными пользователями.

Приложения запускаются в пользовательском режиме (кольцо 3) и переключают контекст, когда он выполняет системный вызов для запроса службы от ядра.

http://en.wikipedia.org/wiki/Ring_(computer_security)

http://en.wikipedia.org/wiki/Context_switch

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .