Режим работы процессора
Режим работы процессора (также известный как режим процессора, состояние процессора, уровень привилегий процессора) — это режим функционирования центрального процессора (англ. central processing unit, CPU), характерный для большинства архитектур компьютеров, который накладывает ограничения на тип и объем операций, разрешённых для инструкций, выполняемых процессором. Такая схема позволяет, например, операционной системе работать с бо́льшими привилегиями, чем прикладное программное обеспечение, выполняя компоненты ОС и приложения в разных режимах.
В идеале только полностью доверенный код ядра имеет право выполняться в неограниченном режиме, тогда как все остальное (включая «некорневые» компоненты операционной системы) работает в ограниченном режиме и должно использовать системный вызов (через прерывание) для запроса к ядру выполнения операций, способных нанести вред системе или повлиять на её безопасность. Это делает невозможным для недоверенных программ изменение или повреждение других программ (или самой вычислительной системы). Драйверы устройств проектируются как часть ядра ввиду необходимости частого обращения к операциям ввода-вывода.
Современное понятие режима работы процессора также включает динамические состояния управления питанием и производительностью. В современных системах режим работы представляет собой непрерывно адаптирующееся состояние, балансирующее производительность и энергопотребление[1].
Типы режимов
Неограниченный режим часто называют режимом ядра, однако в литературе встречаются и другие обозначения: главный режим, режим супервизора, привилегированный режим и др. Ограниченные режимы обычно называются пользовательскими режимами, но также известны как подчинённый режим, проблемное состояние и др[2].
- Гипервизор
- Режим гипервизора используется для поддержки виртуализации, обеспечивая одновременную работу нескольких операционных систем.
- Современные аппаратные расширения (например, Intel VT-rp) позволяют защищать структуры страниц памяти гипервизора без добавления новых явных уровней в иерархию режимов[3].
- Ядро и пользовательский режим
- В режиме ядра процессору разрешена любая операция, поддерживаемая архитектурой: можно выполнять любые инструкции, инициировать ввод-вывод, обращаться к любым областям памяти и т. д. В других режимах процессора аппаратурно накладываются ограничения на выполняемые операции. Обычно, выполнение некоторых инструкций запрещено (особенно тех, которые могут изменить глобальное состояние машины, включая операции ввода-вывода), отдельные области памяти становятся недоступны и т. д. Возможности пользовательского режима составляют подмножество возможностей режима ядра, однако в отдельных случаях (например, при аппаратной эмуляции чужих архитектур) они могут значительно отличаться от стандартного режима ядра.
Некоторые архитектуры процессоров поддерживают большее число режимов, выстраивая иерархию привилегий. Такие архитектуры иногда говорят, что реализуют кольцевую модель безопасности, где степень привилегий соответствует вложенным кольцам — с режимом ядра в центре. Multics стала первым значимым примером аппаратной реализации кольцевой изоляции, но аналогичный подход применялся в режиме защищённой памяти 80286, IA-64, хотя в последних этот принцип назывался по-другому.
Ограничения по режимам могут распространяться и на ресурсы помимо самого процессора. Аппаратные регистры отслеживают текущий режим процессора, однако дополнительные регистры виртуальной памяти, таблицы страниц и прочие структуры также могут хранить информацию о разрешённых режимах для других ресурсов. Например, CPU может работать в нулевом кольце (Ring 0), что отражается в статусном слове, но при каждом обращении к памяти дополнительно проводится проверка соответствия кольца для сегмента виртуальной памяти и/или кольца для конкретной физической страницы. Такой подход реализован, например, в PSP.
Аппаратура, удовлетворяющая условиям виртуализации Попека — Голдберга, существенно облегчает написание эффективного программного обеспечения для виртуальных машин. В такой системе возможно выполнение ПО, считающего себя исполняемым в режиме супервизора, хотя реально оно работает в пользовательском режиме.
Динамические режимы энергопотребления
Динамические состояния управления питанием современных процессоров классифицируются на состояния простоя (C-states) и активные состояния производительности (P-states). Состояния простоя варьируются от C0 (активный режим, при котором выполняются задачи) до глубоких состояний сна (C1—C8), при которых происходит последовательное отключение выполнения инструкций, тактового генератора и кэш-памяти для снижения энергопотребления. В активном состоянии C0 процессор может находиться в различных состояниях производительности (P-states), среди которых выделяют P0 (пиковая производительность), P1 (80—90 % от максимальной частоты) и P2 (60—70 % от максимальной частоты)[4]. В активном состоянии C0 процессор может находиться в различных состояниях производительности (P-states), среди которых выделяют P0 (пиковая производительность), P1 (80—90 % от максимальной частоты) и P2 (60—70 % от максимальной частоты). Алгоритмы динамического изменения частоты (буста) управляются тепловыми (текущая температура, температурные лимиты) и электрическими (потребляемая мощность, напряжение, токовые лимиты) ограничениями[5].
Архитектуры
Ряд вычислительных систем, появившихся в 1960-х годах, таких как IBM System/360, DEC PDP-6/PDP-10, серия GE-600/Honeywell 6000 и системы Burroughs B5000 и B6500, поддерживали два режима работы процессора: режим с полными привилегиями для исполняемого кода и режим, при котором прямой доступ к устройствам ввода-вывода и к некоторым другим аппаратным функциям был запрещён. Эти режимы назывались различными именами: состояние супервизора (System/360), режим исполнения (PDP-6/PDP-10), главный режим (GE-600 series), режим управления (B5000), состояние управления (B6500). Ограниченный режим назывался проблемным состоянием (System/360), пользовательским режимом (PDP-6/PDP-10), подчинённым режимом (GE-600 series), нормальным состоянием (B6500), а в B5000 существовало несколько «неконтрольных» режимов.
x86
В современных процессорах архитектуры x86 сохраняется аппаратная поддержка 16-битного «реального режима» (Real Mode)[6].
Технология FRED (Flexible Return and Event Delivery) заменяет классическую таблицу дескрипторов прерываний (IDT). Она осуществляет программную диспетчеризацию событий и аппаратно фиксирует работу системы строго в кольце 0 (режим ядра) и кольце 3 (пользовательский режим), делая промежуточные кольца защиты недоступными[7][8].
ARM
В архитектуре ARM выделяются уровни исключений (Exception Levels) от EL0 (наименьшие привилегии) до EL3 (наибольшие привилегии). Эти уровни соответствуют классической кольцевой модели защиты[9][10]:
- EL0 (соответствует Ring 3) используется для выполнения пользовательских приложений;
- EL1 (соответствует Ring 2) предназначен для гостевой операционной системы или ядра;
- EL2 (соответствует Ring 1) используется для гипервизора;
- EL3 (соответствует Ring 0) предназначен для монитора безопасности (Secure monitor).
В архитектуре ARM с расширением RME (Realm Management Extension) реализовано состояние безопасности Realm, предназначенное для изоляции данных и кода. Это состояние охватывает уровни от EL0 до EL2, тогда как уровень EL3 выделен в отдельное состояние безопасности Root.
RISC-V
В архитектуре RISC-V определены три основных режима работы процессора: пользовательский режим (U, от англ. User Mode), режим супервизора (S, от англ. Supervisor Mode) и машинный режим (M, от англ. Machine Mode)[11]. Расширение Hypervisor (H-extension) вводит дополнительные режимы HS, VS и VU для поддержки виртуализации[12]. Также существует режим отладки (D-mode), который обладает более высокими правами доступа, чем машинный режим (M-mode)[13]. В классической кольцевой модели режимы U, S и M соответствуют кольцам Ring 3, Ring 1 и Ring 0 соответственно[14].