Какие отличия в работе процессора в привилегированном и пользовательском режимах

Обновлено: 21.11.2024

Процессоры ARM имеют режимы привилегий, которые позволяют запрещать выполнение определенных операций выполняемым процессом. Режимы привилегий, которые есть у ЦП в 3DS, следующие:

Режим Описание
Пользователь Непривилегированный режим. Приложения обычно работают в этом режиме
System Запускает приложения с повышенными привилегиями. Системный режим можно рассматривать как нечто среднее между режимами пользователя и супервизора. Он предоставляет привилегии режима супервизора, но разделяет регистры с режимом пользователя.
FIQ Процессоры ARM имеют два типа типов прерываний: обычные прерывания и быстрые прерывания (FIQ). Единственная разница между быстрыми прерываниями и обычными прерываниями заключается в том, что быстрые прерывания могут прерывать обычные прерывания (что-то вроде глотка). Поскольку процессоры ARM не имеют немаскируемых прерываний (NMI), при необходимости FIQ можно отключить. Прерывания, которые должны завершиться очень быстро, будут использовать этот режим.
IRQ Обычный режим прерывания. Прерывания, которые не являются критичными по времени (не требуют точности синхронизации), обычно используют этот режим.
Supervisor Привилегированный режим для операционной системы.< /td>
Abort Этот режим активируется всякий раз, когда возникает исключение прерывания.
Не определено Этот режим включается всякий раз, когда поступает сигнал об исключении неопределенной инструкции. Обычно всякий раз, когда встречается исключение неопределенной инструкции, процессор ARM будет ждать и смотреть, смогут ли какие-либо сопроцессоры обработать инструкцию. Если нет, то берется неопределенный вектор команд. Некоторое программное обеспечение может фактически использовать эту форму обработки исключений для эмуляции неопределенных инструкций сопроцессора

В ARM11 MPCore оба ядра работают в режиме пользователя. В пользовательском режиме доступ к некоторым другим регистрам невозможен (например, к большинству регистров сопроцессора CP15). Невозможно явно переключиться в более высокий привилегированный режим из пользовательского режима.

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

Регистры, которые должны быть затенены в режиме процессора, различаются. В таблице ниже показаны регистры, затененные для каждого режима в ARM11 MPCore.

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

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

Ядро предоставляет интерфейс системных вызовов (SCI), который является точкой входа для ядра. Системные вызовы — это единственный способ, с помощью которого процесс может перейти в режим ядра из пользовательского режима. На приведенной ниже диаграмме подробно объясняется переход из пользовательского режима в режим ядра.

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

  • Вызывает функцию библиотеки Glibc.
  • Библиотека Glibc знает правильный способ вызова системного вызова для различных архитектур. Он настраивает передаваемые аргументы в соответствии с архитектурным двоичным интерфейсом приложений (ABI) для подготовки к вводу системного вызова.
  • Теперь Glibc вызывает инструкцию SWI (инструкцию программного прерывания для ARM), которая переводит процессор в режим супервизора, обновляя биты режима в регистре CPSR, и переходит к адресу вектора 0x08.
  • До сих пор процесс выполнялся в пользовательском режиме. После выполнения инструкции SWI процессу разрешается выполнять код ядра. Модуль управления памятью (MMU) теперь разрешает доступ к виртуальной памяти ядра и выполнение этого процесса.
  • От вектора с адресом 0x08 выполнение процесса загружается и переходит к подпрограмме обработчика прерываний SW, которой является vector_swi() для ARM.
  • В vector_swi() номер системного вызова (SCNO) извлекается из инструкции SWI, и выполнение переходит к функции системного вызова с использованием SCNO как индекс в таблице системных вызовов sys_call_table.
  • После выполнения системного вызова в обратном пути регистры пользовательского пространства восстанавливаются перед запуском выполнения в пользовательском режиме.

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

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

Ключевая разница — режим пользователя и режим ядра

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

СОДЕРЖАНИЕ

Что такое пользовательский режим?

Когда компьютерное приложение запущено, оно находится в пользовательском режиме. Вот некоторые примеры: текстовое приложение, PowerPoint, чтение PDF-файла и работа в Интернете. Это прикладные программы, поэтому компьютер находится в пользовательском режиме. Когда процесс находится в пользовательском режиме и требует каких-либо аппаратных ресурсов, этот запрос отправляется ядру. Поскольку в этом режиме существует ограниченный доступ к оборудованию, он называется менее привилегированным режимом, подчиненным режимом или ограниченным режимом.

Рисунок 02: Режимы работы

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

Что такое режим ядра?

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

Когда процесс выполняется в пользовательском режиме, и если этому процессу требуются аппаратные ресурсы, такие как ОЗУ, принтер и т. д., этот процесс должен отправить запрос ядру. Эти запросы отправляются через системные вызовы. Затем компьютер входит в режим ядра из пользовательского режима. Когда задача завершена, режим снова меняется на пользовательский из режима ядра. Этот переход известен как «переключение контекста». Режим ядра также называется системным режимом или привилегированным режимом. Невозможно запустить все процессы в режиме ядра, потому что в случае сбоя процесса может произойти сбой всей операционной системы.

Рисунок 02: Ядро

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

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

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

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

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

Компьютер работает либо в пользовательском режиме, либо в режиме ядра. Разница между режимом пользователя и режимом ядра заключается в том, что пользовательский режим — это ограниченный режим, в котором работают приложения, а режим ядра — это привилегированный режим, в который входит компьютер при доступе к аппаратным ресурсам. Компьютер переключается между этими двумя режимами.Частое переключение контекста может замедлить скорость, но невозможно выполнить все процессы в режиме ядра. Это потому, что; сбой одного процесса может привести к сбою всей операционной системы.

Загрузить PDF-версию пользовательского режима и режима ядра

Вы можете загрузить PDF-версию этой статьи и использовать ее в автономном режиме в соответствии с примечанием к цитированию. Загрузите PDF-версию здесь. Разница между режимом пользователя и режимом ядра

Ссылка:

1.nabazan-microsoft. «Режим пользователя и режим ядра». Документы Майкрософт. Доступно здесь
2.pranitpkothari. YouTube, YouTube, 23 февраля 2015 г. Доступно здесь
3. «Пояснение — системные вызовы и типы системных вызовов в операционной системе». ,Last moment Learning, YouTube, 12 июля 2017 г. Доступно здесь

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

@CiroSantilli709大抓捕六四事件法轮功 вопрос, который был задан 7 лет назад, не может быть закрыт как дубликат вопроса, заданного 6 лет назад. Если они действительно являются дубликатами, замыкание должно быть наоборот.

@SalvadorDali привет, текущий консенсус заключается в том, чтобы закрыть по «качеству»: meta.stackexchange.com/questions/147643/… Поскольку «качество» не поддается измерению, я просто опираюсь на голоса. ;-) Скорее всего, все сводится к тому, какой вопрос попал в заголовки лучших новых ключевых слов Google. Я рекомендую вам просто скопировать свой ответ туда с добавленным внизу заявлением об отказе от ответственности и ссылкой на этот ответ на случай, если он закроется.

7 ответов 7

  1. Режим ядра

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

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

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

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

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

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

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

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

Кольца ЦП — наиболее четкое различие

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

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

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

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

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

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

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

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

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

Чип ЦП физически сконструирован таким образом, что:

кольцо 0 может все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

скомпилировать и запустить:

Когда это происходит, ЦП вызывает обработчик обратного вызова прерывания, который ядро ​​зарегистрировало во время загрузки. Вот конкретный пример «голого железа», который регистрирует обработчик и использует его.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Минус кольца

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

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

Подробнее см.:

РУКА

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

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

EL1: ядро ​​("супервизор" в терминологии ARM).

Вводится с помощью инструкции svc (вызов SuperVisor), ранее известной как swi перед унифицированной сборкой, которая используется для выполнения системных вызовов Linux. Привет, мир, пример ARMv8:

Протестируйте QEMU в Ubuntu 16.04:

Вот конкретный пример «голого железа», в котором регистрируется обработчик SVC и выполняется вызов SVC.

Введено с помощью инструкции hvc (вызов гипервизора).

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

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

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

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

Выполняется с помощью инструкции smc (вызов в защищенном режиме)

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

Ситуация с ARM немного изменилась с появлением ARMv8.1 Virtualization Host Extensions (VHE). Это расширение позволяет ядру эффективно работать в EL2:

VHE был создан, потому что решения виртуализации в ядре Linux, такие как KVM, превзошли Xen (см., например, переход AWS на KVM, упомянутый выше), потому что большинству клиентов нужны только виртуальные машины Linux, и, как вы можете себе представить, в одном проекте KVM проще и потенциально более эффективен, чем Xen. Так что теперь в таких случаях гипервизором выступает ядро ​​хоста Linux.

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

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

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

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

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

Фрагменты кода протестированы на Ubuntu 18.10.

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

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

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

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

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

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

Читайте также: