Защита памяти (Операционные Системы)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:26, 24 августа 2017.

Защита памяти (англ. Memory protection) — это способ управления правами доступа к отдельным регионам памяти. Используется большинством многозадачных операционных систем. Основной целью защиты памяти является запрет доступа процессу к той памяти, которая не выделена для этого процесса. Такие запреты повышают надежность работы как программ так и операционных систем, так как ошибка в одной программе не может повлиять непосредственно на память других приложений. Следует различать общий принцип защиты памяти и технологии ASLR или NX-бит.[1]

Защита по уровню привилегей

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

Image011.gif

Уровни привилегий обеспечивают защиту целостности операционной системы от «недружелюбных» программ. А также защиту адресных пространств одновременно выполняемых задач. Сервисы операционной системы, обработчики прерываний и другое системное обеспечение могут включаться в виртуальное адресное пространство каждой задачи и защищаться системой привилегий. Как правило, назначение уровней следующее. Нулевой уровень – уровень операционной системы (ядро операционной системы). Уровни 1 и 2 – программы системного назначения. Уровень 3 – прочие прикладные программы (уровень прикладных программ). Дескрипторы (сегменты) и селекторы имеют свои атрибуты привилегий. Привилегии задач оказывают влияние на выполнение инструкций и использование дескрипторов. Текущий уровень привилегии задачи CPL (Current Privilege Level) определяется двумя младшими битами регистра CS.

CPL задачи может изменяться только при передаче управления к новому сегменту через дескриптор шлюза. Задача начинает выполняться с уровня CPL, указанного селектором кодового сегмента внутри TSS, когда задача иницииру­ется посредством операции переключения задач. Задача, выполняемая на нуле­вом уровне привилегий, имеет доступ ко всем сегментам, описанным в GDT, и является самой привилегированной. Задача, выполняемая на уровне 3, имеет самые ограниченные права доступа. Текущий уровень привилегии задачи может изме­няться только при передаче управления через шлюзы. Привилегии сегмента задаются полем DPL байта управления доступом.

Image006.png

DPL определяет наибольший номер уровня привилегий (фактически, наименьшие привилегии), с которым возможен доступ к данному дескриптору. Самый защищенный (привилегированный) дескриптор имеет DPL=0, к нему имеют до­ступ только задачи с CPL=0. Самый общедоступный дескриптор имеет DPL=3, его могут использовать задачи с CPL=0, 1, 2, 3. Это правило применимо ко всем дескрипторам, за исключением дескриптора LDT. Привилегии селектора задаются полем RPL (Requested Privilege Level) — двумя младшими битами селектора. [2]

Метод защиты ключей

211.png

Защита памяти по ключам (уровням привилегий) используется в большинстве современных многопрограммных ЭВМ со страничной органи­зацией памяти и динамическим её распределением между параллельно вы­полняемыми программами. В её основе лежит применение специальных ко­дов (уровней) для проверки соответствия используемых массивов ячеек па­мяти номеру выполняемой программы.

Каждой рабочей программе ОС придает специальный ключ — ключ программы. Все выделенные для данной рабочей программы страницы от­мечаются одним и тем же ключом страницы или ключом защиты. В качест­ве ключа защиты обычно указывается двоичный код номера программы. В процессе обращения к ОП производится сравнение ключа выполняемой про граммы с ключами защиты соответствующих страниц памяти. Обращение разрешается только при совпадении сравниваемых кодов ключей. Защита па­мяти по ключам применяется не только при работе ОП с процессором, но и в ходе обмена информацией с ВЗУ через каналы ввода-вывода. Тогда вместо ключей программ используются ключи каналов. Разрядность кодов ключей определяется максимальным количеством параллельно выполняемых программ. [3]

Метод граничных регисторов

1.png

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

При каждом обращении к памяти проверяется, находится ли используемый адрес в установленных границах. При выходе за границы обращение к памяти подавляется и формируется запрос прерывания, передающий управление операционной системе. Содержание граничных регистров устанавливается операционной системой перед тем, как для очередной целевой программы начнется активный цикл. Если для динамического распределения памяти используется базовый регистр, то он одновременно определяет и нижнюю границу. Верхняя граница подсчитывается операционной системой в соответствии с длиной программы в ОП. Преимущество данного способа защиты памяти состоит в том, что он позволяет защищать области памяти произвольной длины. Кроме того, блок защиты достаточно прост, а его функционирование не приводит к значитель­ным временным затратам. Однако необходимость размещения программ в областях памяти с последовательными номерами ячеек и ограниченных дву­мя граничными адресами существенно снижает возможности программиро­вания и даже эффективность работы ЭВМ. Поэтому способ защиты памяти по граничным адресам в настоящее время применяется редко, при статиче­ском распределении памяти, когда для каждой из параллельно выполняемых рабочих программ заранее (до начала их выполнения) отводится определен­ная область памяти. Реализация способа защиты памяти предполагает разделение основной памяти на блоки, каждому из которых ставится в соответствие некоторый ключ защиты памяти. Каждой действующей программе ставится в соответствие ключ защиты, который имеет ту же длину, что и ключ защиты памяти. Если эти ключи совпадают или ключ защиты памяти равен нулю, та использование данного блока памяти разрешается. В противном случае использование памяти запрещено и вырабатывается сигнал прерывания программы. В ключе защиты памяти часто предусматривается бит защиты памяти при выборке. Если этот бит равен нулю, то защита действует только при записи в память. Если же бит защиты при выборке равен единице, защита действует при операции выборки так же, как и при записи.

Защита памяти по маскам

Защита памяти по маскам используется при страничной организации ОП. Для каждой программы перед её выполнением указываются номера страниц, отведенные для размещения её команд и всех необходимых данных. Указание о номерах отведенных страниц для данной программы задается управляющей программой операционной системы в виде кода маски или ко­да признаков страниц. Код маски формируется для каждой рабочей програм­мы. Под маской программы понимается n-разрядный двоичный код, разряд­ность которого определяется количеством страниц ОП. Каждый i-й разряд маски указывает о принадлежности i-й страницы ОП данной программе: если в i-м разряде задано значение 1, то при обращении к ОП разрешен доступ к любой ячейке i-ой страницы, если же i-й разряд маски содержит ноль, то вы­полняемой программе доступ к i-й странице запрещен.

Примечания

  1. Защита памяти [Электронный ресурс]: — Режим доступа: http://dic.academic.ru/dic.nsf/ruwiki/1498602
  2. Защита памяти [Электронный ресурс]: — Режим доступа : http://x86.migera.ru/text/glava_3.html
  3. Методы защиты памяти: метод граничных регистров, метод ключей защиты, защита отдельных ячеек. [Электронный ресурс]: — Режим доступа : https://sites.google.com/site/gosyvmkss12/organizacia-evm-i-sistem/23-metody-zasity-pamati-metod-granicnyh-registrov-metod-klucej-zasity-zasita-otdelnyh-aceek