В чем разница между режимом пользователя и режимом ядра? зачем нужен контекстный переключатель при переключении между 2?
3 ответа
Мой ответ относится к Linux, потому что это то, что я знаю, но оно должно быть одинаково правильным для большинства, если не для всех версий Unix.
В пользовательском режиме выполняются все процессы, которые не являются частью ядра (иначе говоря, «неядерные процессы»). По умолчанию в пользовательском режиме процесс может напрямую обращаться только к собственной памяти. Это необходимо для защиты процессов друг от друга и для предотвращения ошибки в одном процессе, вызывающей сбой другого процесса. Это также помогает обеспечить безопасность, поскольку процесс с низким уровнем привилегий не может напрямую обращаться к памяти процесса, выполняющегося от имени другого пользователя, который может содержать конфиденциальные данные, такие как данные кредитной карты.
Однако в ядре есть некоторые операции, которым требуется доступ ко всей системной памяти, например, создание новых процессов. Для этого нужен режим ядра, поскольку он может получить доступ к любому физическому или виртуальному адресу, который физически доступен. (Для целей этого ответа я игнорирую гипервизоры, которые немного усложняют эту картину.)
Переключение между пользовательским режимом и режимом ядра может потребовать переключения контекста, но только из-за давнего соглашения, а не потому, что это абсолютно необходимо. Источник: http://en.wikipedia.org/wiki/Context_switch#User_and_kernel_mode_switching
Предполагая архитектуру x86:
Пользовательский режим:
Схема виртуальной памяти действует. В пользовательском режиме адреса памяти сопоставляются с физическими адресами через таблицы страниц. Таким образом, когда программа пользовательского режима обращается к памяти, например, в ячейке памяти 0x0001000, она, вероятно, перенаправляется через механизм виртуальной памяти на совершенно другой адрес. Это также контролирует доступ к оборудованию, доступ к которому осуществляется через ячейки памяти, такие как ОЗУ, такие как регистры APIC, видеопамять и т.д. Вот почему процесс пользовательского режима не может "вырваться из своей оболочки" и изменить места в памяти, где живут другие программы.
Действует механизм привилегий ввода / вывода. Это влияет на определенное оборудование, которое использует «порты ввода / вывода» (не имеет отношения к портам TCP / IP), например устаревшее оборудование PIC и PIT, память CMOS и т.д. Пользовательский режим может получать доступ только к портам ввода / вывода, разрешенным "битовой картой IOPL", не может отключать прерывания и не может изменять IOPL.
Привилегированные инструкции процессора вызовут исключение, если выполнятся. Это включает в себя инструкции по настройке таблиц страниц и другие вещи.
Режим ядра:
- Схема виртуальной памяти не действует. Когда процессор читает память, адрес, который он запрашивает, является адресом, который он получает. Другими словами, это «квартира».
Да, процесс в режиме ядра может полностью перезаписать другие процессы или код в памяти, например критические структуры ядра или драйверы устройств.
Механизм привилегий ввода / вывода не действует. CPU может получить доступ к любому порту ввода / вывода без ограничений и установить IOPL для пользовательского режима.
Все привилегированные инструкции могут быть выполнены без исключения.
"Переключение контекста" необходимо, потому что всякий раз, когда ЦП x86 запускает программу, в ее регистрах присутствует значительная часть текущего состояния этой программы в данный момент, в дополнение к областям памяти, которые она может использовать для переменных и временного хранения.
Итак, если мы хотим, чтобы ЦП внезапно перешел в другое место, а затем вернулся к тому, что делал раньше, необходимо сохранить все регистры ЦП, чтобы они могли быть восстановлены до перехода назад.
Ядро отвечает за управление ресурсами системы (планирование, управление памятью, работа в сети и т.д.). Ядро работает в защищенном контексте, называемом кольцом 0, чтобы предотвратить его модификацию непривилегированными пользователями.
Приложения запускаются в пользовательском режиме (кольцо 3) и переключают контекст, когда он выполняет системный вызов для запроса службы от ядра.