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

Каковы различия между пользовательским режимом и режимом ядра, почему и как вы активируете любой из них, и каковы их варианты использования?

 Salvador Dali19 июн. 2017 г., 07:35
@ CiroSantilli709 大 抓捕 六四 事件 法轮功 вопрос, который был задан 7 лет назад, не может быть закрыт как дубликат для вопроса, заданного 6 лет назад. Если они действительно дубликаты, закрытие должно быть наоборот.
@ SalvadorDali Привет, текущий консенсус заключается в том, чтобы закрыть "качество":meta.stackexchange.com/questions/147643/... Так как «качество» не поддается измерению, я просто иду на голосование. ;-) Скорее всего, все сводится к тому, какой вопрос поразил лучшие новые ключевые слова Google в заголовке. Я призываю вас просто скопировать свой ответ туда с добавленным внизу заявлением об отказе от ответственности и ссылкой с него на случай, если он закроется.

Ответы на вопрос(7)

Кольца процессора - самое четкое различие

В защищенном режиме x86 процессор всегда находится в одном из 4 звонков. Ядро Linux использует только 0 и 3:

0 для ядра3 для пользователей

Это наиболее сложное и быстрое определение ядра и пользовательского пространства.

Почему Linux не использует кольца 1 и 2:Кольца привилегий ЦП: почему кольца 1 и 2 не используются?

Как определяется текущее кольцо?

Текущее кольцо выбирается комбинацией:

таблица глобальных дескрипторов: таблица в памяти записей GDT, и у каждой записи есть полеPrivl который кодирует кольцо.

Инструкция LGDT устанавливает адрес для текущей таблицы дескрипторов.

Смотрите также:http://wiki.osdev.org/Global_Descriptor_Table

Сегмент регистрирует CS, DS и т. д., которые указывают на индекс записи в GDT.

Например,CS = 0 означает, что первая запись GDT в данный момент активна для исполняемого кода.

Что может сделать каждое кольцо?

Чип процессора физически построен так, что:

кольцо 0 может сделать что угодно

кольцо 3 не может выполнить несколько инструкций и записать в несколько регистров, в частности:

не может изменить свое собственное кольцо! В противном случае он мог бы установить себе кольцо 0, и кольца были бы бесполезны.

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

не может изменить таблицы страниц:Как работает пейджинг на x86?

Другими словами, нельзя изменить регистр CR3, а само разбиение на страницы предотвращает изменение таблиц страниц.

Это препятствует тому, чтобы один процесс видел память других процессов из соображений безопасности / простоты программирования.

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

Обработчики работают в кольце 0 и нарушают модель безопасности.

Другими словами, нельзя использовать инструкции LGDT и LIDT.

не может сделать инструкции IO, такие какin а такжеoutи, таким образом, иметь произвольный доступ к оборудованию.

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

Точнее благодаряМайкл Петч: на самом деле ОС может разрешить инструкции ввода-вывода на кольце 3, это на самом деле контролируетсяСегмент состояния задачи.

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

Linux всегда запрещает это. Смотрите также:Почему Linux не использует аппаратное переключение контекста через TSS?

Как программы и операционные системы переходят между кольцами?

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

когда пользовательский процесс хочет, чтобы ядро сделало что-то для него, например, запись в файл, он использует инструкцию, которая генерирует прерывание, такое какint 0x80 сигнализировать ядро.

Когда это происходит, процессор вызывает и обрабатывает обработчик обратного вызова, который ядро зарегистрировало во время загрузки.

Этот обработчик работает в кольце 0, который решает, разрешит ли ядро это действие, выполняет действие и перезапускает программу пользователя в кольце 3.

когдаexec системный вызов используется (или когда ядроначнет/init) ядроготовит регистры и память нового пользовательского процесса, затем он переходит к точке входа и переключает ЦП на звонок 3

Если программа пытается сделать что-то непослушное, например запись в запрещенный регистр или адрес памяти (из-за подкачки), ЦП также вызывает некоторый обработчик обратного вызова ядра в кольце 0

Но поскольку пользовательская область была непослушной, ядро на этот раз может убить процесс или выдать ему предупреждение с сигналом.

Когда ядро загружается, оно устанавливает аппаратные часы с некоторой фиксированной частотой, которая периодически генерирует прерывания.

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

Таким образом, планирование может происходить, даже если процессы не выполняют никаких системных вызовов.

Какой смысл иметь несколько колец?

Существует два основных преимущества разделения ядра и пользовательского пространства:

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

Как поиграть с этим?

Я создал голую металлическую установку, которая должна быть хорошим способом манипулирования кольцами напрямую:https://github.com/cirosantilli/x86-bare-metal-examples

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

В качестве альтернативы модули ядра Linux работают в кольце 0, поэтому вы можете использовать их для проверки привилегированных операций, например, прочитайте контрольные регистры:Как получить доступ к управляющим регистрам cr0, cr2, cr3 из программы? Получение ошибки сегментации

Вотудобная настройка QEMU + Buildroot попробовать, не убивая своего хозяина.

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

Отрицательные кольца

Хотя отрицательные кольца фактически не упоминаются в руководстве Intel, на самом деле существуют режимы ЦП, которые имеют более широкие возможности, чем само кольцо 0, и поэтому хорошо подходят для имени «отрицательного кольца».

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

Для получения дополнительной информации см .:https://security.stackexchange.com/questions/129098/what-is-protection-ring-1

РУКА

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

В ARMv8 существует 4 уровня исключений, которые обычно используются как:

EL0: пользовательская область

EL1: ядро

EL2:гипервизоров, напримерXen.

Гипервизор для ОС, то же самое, что ОС для пользователя.

Например, Xen позволяет одновременно запускать несколько ОС, таких как Linux или Windows, в одной и той же системе и изолирует ОС друг от друга для обеспечения безопасности и простоты отладки, как это делает Linux для пользовательских программ.

Гипервизоры являются ключевой частью современной облачной инфраструктуры: они позволяют нескольким серверам работать на одном оборудовании, поддерживая аппаратное использование всегда близким к 100% и экономя много денег.

Например, AWS использовал Xen до 2017 года, когдаего переход на KVM сделал новость.

EL3: еще один уровень. Пример TODO.

Эталонная модель архитектуры ARMv8 DDI 0487C.a - Глава D1 - Модель программиста на уровне системы AArch64 - Рисунок D1-1 прекрасно иллюстрирует это:

Обратите внимание, что ARM, возможно, благодаря ретроспективе, имеет лучшее соглашение об именах для уровней привилегий, чем x86, без необходимости использования отрицательных уровней: 0 - нижний, а 3 - самый высокий. Более высокие уровни, как правило, создаются чаще, чем более низкие.

Текущий EL может быть запрошен сMRS инструкция:каков текущий режим выполнения / уровень исключения и т. д.?

ARM не требует наличия всех уровней исключений, чтобы обеспечить реализации, которым не требуется эта функция для сохранения площади микросхемы. ARMv8 «Уровни исключений» говорит:

Реализация может не включать все уровни исключений. Все реализации должны включать EL0 и EL1. EL2 и EL3 являются необязательными.

QEMU, например, по умолчанию EL1, но EL2 и EL3 могут быть включены с параметрами командной строки:qemu-system-aarch64 вводит el1 при эмуляции включения a53

 Michael Petch21 февр. 2018 г., 03:37
Поскольку этот вопрос не является специфическим для любой ОС,in а такжеout доступны для звонка 3. TSS может указывать на таблицу разрешений ввода-вывода в текущей задаче, предоставляя доступ на чтение / запись ко всем или определенным портам.
 Michael Petch21 февр. 2018 г., 04:44
Конечно, вы устанавливаете биты IOPL на значение 3, тогда программа ring 3 имеет полный доступ к порту, и разрешения TSS IO не применяются.
 Ciro Santilli 新疆改造中心 六四事件 法轮功21 февр. 2018 г., 14:33
@MichaelPetch спасибо, я этого не знал. Я обновил ответ.

какая

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

Как

Это означает, что процессор живет либо в режиме ядра, либо в режиме пользователя. Используя некоторые механизмы, архитектура может гарантировать, что всякий раз, когда она переключается в режим ядра, код ОС выбирается для запуска.

Почему

Имея эту аппаратную инфраструктуру, этого можно достичь в обычных ОС:

Защита пользовательских программ от доступа ко всей памяти, чтобы не позволить программам перезаписывать ОС, например,не позволяя пользовательским программам выполнять чувствительные инструкции, такие как те, которые изменяют границы указателя памяти ЦП, например, чтобы программы не позволяли программам выходить за границы их памяти.

. Если вы действительно хотите вдаваться в подробности, вы должны получить копиюWindows InternalsОтличная книга, написанная Марком Руссиновичем и Дэвидом Соломоном, рассказывающая об архитектуре и внутренних деталях различных операционных систем Windows.

что вы говорите о Windows. В двух словах, режим ядра имеет полный доступ к оборудованию, а режим пользователя - нет. Например, многие, если не большинство драйверов устройств написаны в режиме ядра, потому что они должны контролировать более тонкие детали своего оборудования.

Смотрите такжеэтот викибук.

 Adam Liss21 авг. 2009 г., 13:39
Это важно для вас как для программиста, потому что ошибки в ядре, как правило, наносят гораздо больший ущерб, чем вы привыкли. Одна из причин различия между ядром и пользователем заключается в том, что ядро может контролировать / контролировать критические системные ресурсы и защищать каждого пользователя от других. Это немного упрощенно, но все же полезно, чтобы напомнить себе, что ошибки пользователя часто раздражают, но ошибки ядра, как правило, приводят к поломке всей машины.
Решение Вопроса

В режиме ядра исполняемый код имеет полный и неограниченный доступ к базовому оборудованию. Он может выполнить любую инструкцию процессора и ссылаться на любой адрес памяти. обычно зарезервирован для самых надежных функций операционной системы самого низкого уровня. Сбои в режиме ядра являются катастрофическими; они остановят весь компьютер.

Режим пользователя

В режиме пользователя исполняемый код не имеет возможности прямого доступа к аппаратной или эталонной памяти. Код, работающий в пользовательском режиме, должен делегировать системным API для доступа к оборудованию или памяти. Благодаря защите, обеспечиваемой такого рода изоляцией, сбои в пользовательском режиме всегда исправимы. Большая часть кода, запущенного на вашем компьютере, будет выполняться в пользовательском режиме.

Читать далее

Понимание режима пользователя и ядра

 kadina21 авг. 2014 г., 02:19
@JackieLam: должно быть в режиме ядра.
 roottraveller09 сент. 2017 г., 14:57
Так само по себе, чтобы запуститьпространство пользователя процесс, он должен быть сопоставлен спространство ядра?
 JackieLam19 июн. 2013 г., 11:00
Интересно, когда на процессоре работает код операционной системы, в каком режиме он работает?

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

Когда вы запускаете приложение в пользовательском режиме, Windows создает процесс для приложения. Процесс предоставляет приложению личное виртуальное адресное пространство и личную таблицу дескрипторов. Поскольку виртуальное адресное пространство приложения является частным, одно приложение не может изменять данные, принадлежащие другому приложению. Каждое приложение работает изолированно, и в случае сбоя приложения это ограничение ограничивается этим приложением. Другие приложения и операционная система не подвержены сбою.

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

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

Если вы пользователь Windows, перейдя по этой ссылке, вы получите больше.

Связь между пользовательским режимом и режимом ядра

в которых может работать ваш компьютер. До этого, когда компьютеры были похожи на большую комнату, если что-то давало сбой - это останавливало весь компьютер. Поэтому компьютерные архитекторы решили это изменить. Современные микропроцессоры реализуют на аппаратном уровне как минимум 2 разных состояния.

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

режим, в котором выполняются все пользовательские программы. У него нет доступа к оперативной памяти и аппаратному обеспечению. Причина этого в том, что если бы все программы работали в режиме ядра, они могли бы перезаписывать память друг друга. Если ему необходимо получить доступ к любой из этих функций - он обращается к базовому API. Каждый процесс, запускаемый окнами, кроме системного, выполняется в пользовательском режиме.

Режим ядра:

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

Как происходит переключение

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

http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode

http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html

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

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

 Apurv Nerlekar02 февр. 2016 г., 00:49
@JackieLam: режим ядра
 JackieLam19 июн. 2013 г., 11:00
Интересно, когда на процессоре работает код операционной системы, в каком режиме он работает?

Ваш ответ на вопрос