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


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

7 87

7 ответов:

  1. Режим Ядра

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

  2. Режим Пользователя

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

подробнее

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

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

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

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

режим ядра:

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

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

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

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

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

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

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

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

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

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

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

см. также этот wikibook.

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

ЦП кольца являются наиболее четкое различие

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

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

это самое жесткое и быстрое определение ядра против userland.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • невозможно изменить таблицы страниц:как работает x86 подкачка работа?

      другими словами, невозможно изменить регистр CR3, а сама подкачка предотвращает изменение таблиц страниц.

      это предотвращает один процесс от просмотра памяти других процессов по соображениям безопасности / простоты программирования.

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

      обработчики работают в кольце 0, и сломают модель защиты.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

как играть с ним?

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

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

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

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

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

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

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

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

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

ARM

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

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

  • EL0: пользовательские программы

  • EL1 начинает: ядра

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

    гипервизор для ОС, что ОС для userland.

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

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

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

  • EL3: еще один уровень. Пример для подражания.

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

enter image description here

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

что

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

Как

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

почему

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

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