Что определяет уровень привилегий процесса?
Я слышал об уровнях привилегий, кольцах, привилегированных инструкциях, непривилегированных инструкциях, режиме пользователя, режиме ядра, пространстве пользователя, пространстве ядра.
Пользовательский процесс будет запускаться с низким уровнем привилегий, где процесс ОС с более высоким, также я слышал о регистре CPL, который отвечает за общую защиту. Кроме того, CPU знает только CPL, и определяется, к какой странице относится инструкция.
Я хочу знать, кто / что первоначально определяет уровень привилегий процесса?
Когда будет решено, что процесс будет запущен с низким или высоким уровнем привилегий? Во время компиляции? При загрузке?
Что говорит о том, что текущая программа будет работать с определенным уровнем привилегий? Сегмент регистров? Дескрипторы? Грузчик?
2 ответа
Сначала я вижу 3 вопроса.
- Кто / Что первоначально определяет уровень привилегий процесса?
- Когда будет решено, что процесс будет запущен с низким или высоким уровнем привилегий?
- Что говорит о том, что текущая программа будет работать с определенным уровнем привилегий?
Во-вторых, чтобы подтвердить определение некоторых терминов
Когда вы говорите уровень привилегий, я полагаю, что вы имеете в виду понятие уровня привилегий, связанного с режимом процессора, в отличие от общего уровня любого другого доступного механизма привилегий.
Когда вы говорите "процесс", я полагаю, что вы имеете в виду концепцию работающей в данный момент программы, а не какое-то альтернативное определение.
Пользовательские процессы выполняются в пользовательском режиме с привилегиями пользователя для данной архитектуры ЦП.
Процессы ядра выполняются в режиме ядра с привилегией супервизора для данной архитектуры ЦП.
Является ли процесс пользователем или ядром, зависит от того, какие флаги установлены либо в дескрипторах сегмента, когда подкачка не используется, либо в таблицах страниц или записях каталога страниц, где используется подкачка.
Это означает, что уровень привилегий процесса определяется тем, где код этого процесса находится в памяти. Если он находится в пространстве ядра и помечен как таковой с использованием соответствующих флагов, то это процесс ядра. Если он находится в пользовательском пространстве и помечен как таковой с использованием соответствующих флагов, то это пользовательский процесс.
Если процесс / программа, которую вы используете, не является ядром, это пользовательский процесс в большинстве современных операционных систем. Таким образом, когда решение принимается во время выполнения программы, в частности, во время инициализации операционной системы при первой загрузке ядра.
Либо процесс является тем ядром и выполняется на уровне привилегий супервизора, либо он не выполняется, и он работает на уровне привилегий пользователя.
Процессор проверяет каждое выполнение любого кода или сегмента данных из памяти по соответствующим регистрам состояния (регистр состояния кода на Intel X86 и регистр текущего состояния программы на ARM).
Когда пользовательским процессам требуется доступ к ресурсам ядра, общий способ сделать это - позволить пользовательскому процессу запрашивать процесс ядра от его имени, совершая системный вызов, который переключает контекст привилегии, когда процесс ядра выполняет запрос для пользовательский процесс.
Как примечание, Kernel Mode Linux, позволяет запускать пользовательские процессы в режиме ядра / супервизора.
Ссылки и дальнейшее чтение
Большинство процессоров имеют команду прерывания или программного сбоя, которая переводит процессор в привилегированный режим. Ядро проверяет, есть ли у процесса пользовательского режима разрешение на конкретную операцию. Поскольку данные ядра защищены, ядро может применять политику безопасности - пользовательский процесс не может напрямую давать себе разрешения.
Разрешения иногда называют привилегиями, поэтому я хотел объяснить, как режимы процессора работают при применении разрешений безопасности.