5.5. Защита на уровне страниц
Совместно с защитой на уровне сегментов, процессор может использовать защиту на уровне страниц. Особенно это удобно при использовании сплошной модели памяти, когда и операционная система, и прикладные программы работают в едином пространстве логических адресов, т.к. защита на уровне страниц может обеспечить разграничение привилегий для страниц операционной системы и прикладных программ. Защита на уровне страниц предоставляет два типа контроля: ограничение адресного пространства (страницы супервизора и страницы пользователя) и ограничение типа доступа (доступ только для чтения и доступ на чтение-запись). Если проверки не проходят, генерируется страничное нарушение (исключение #14).
На правила защиты на уровне страниц влияют следующие биты:
- U/S - бит уровня привилегий (бит 2 элемента PDE/PTE). Этот бит определяет уровень привилегий доступа к странице (для PTE) или группе страниц (для PDE). Если бит установлен, страница доступна с уровня пользователя. Если сброшен - только с уровня супервизора.
- R/W - бит чтения/записи (бит 1 элемента PDE/PTE). Этот бит определяет тип доступа к странице (для PTE) или группе страниц (для PDE). Если бит сброшен, страница доступна только для чтения. Если установлен - для чтения и записи.
- WP - защита от записи (бит 16 регистра CR0, 486+). Защита от записи страниц с пометкой "read-only" при обращениях с уровня супервизора.
Ограничение адресного пространства на уровне страниц обеспечивается двумя уровнями привилегий: режим супервизора (уровень 0) и режим пользователя (уровень 1). Режим супервизора соответствует привилегиям на уровне сегментов CPL=0, CPL=1 и CPL=2. В режиме супервизора доступны все страницы. Режим пользователя соответствует привилегиям на уровне сегментов CPL=3. В режиме пользователя доступны только страницы пользователя.
В адресное пространство супервизора попадают страницы, для которых соответствующий элемент таблицы страниц ИЛИ каталога таблиц содержит бит US=0. В адресное пространство пользователя попадают страницы, для которых И соответствующий элемент таблицы страниц, И соответствующий элемент каталога таблиц содержат бит US=1.
В определенных случаях процессор обращается к памяти в режиме супервизора вне зависимости от текущего уровня привилегий:
- при доступе к дескрипторам сегментов в LDT, GDT, IDT;
- при копировании параметров при переключении стека (смена уровня привилегий).
В МП Intel386 ограничение типа доступа применяется только в адресном пространстве пользователя. Программа в режиме пользователя имеет право изменять только те страницы, для которых И соответствующий элемент таблицы страниц, И соответствующий элемент каталога таблиц содержат бит RW=1. Если для какой-либо страницы элемент таблицы страниц ИЛИ элемент каталога таблиц содержит бит RW=0, то страница доступна только для чтения. В режиме супервизора все страницы доступны и для чтения, и для записи.
В МП Intel486 и более поздних возможно применение контроля доступа в режиме супервизора, если бит CR0.WP=1. Тогда попытка обращения к странице, для которой элемент таблицы страниц или элемент каталога таблиц содержит бит RW=0, приводит к страничному нарушению на любом уровне привилегий. Это свойство операционные системы могут использовать для реализации механизма "copy-on-write" ("копирование при записи"). Например, Unix при создании нового процесса вызовом fork(), может для дочернего процесса создать набор страниц только для чтения, отображенный в то же физическое пространство, что и родительский процесс. Когда дочерний процесс попытается изменить какие-либо данные, по страничному нарушению операционная система выполнит фактическое копирование изменяемой страницы.
Когда используются оба вида защиты и на уровне страниц, и на уровне сегментов, процессор сначала выполняет проверки защиты сегментов, и только в случае успеха - проверки защиты страниц. Т.е. если доступ к памяти отвергается защитой на уровне сегментов, то будет сгенерировано нарушение общей защиты, а проверки защиты страниц выполняться не будут и дополнительно страничное нарушение не возникнет. Если проверки защиты сегментов проходят успешно, но нарушаются правила защиты страниц, генерируется страничное нарушение. Доступ к памяти предоставляется, только когда выполнены все правила и для сегментов, и для страниц.