Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций 2009.doc
Скачиваний:
43
Добавлен:
13.11.2019
Размер:
2.3 Mб
Скачать

2.3.2Права доступа к области памяти

Рассмотрим далее права доступа к области памяти (табл. 2.4):

Таблица 2.4. Права доступа к области памяти в Linux.

Имя флага

Описание

VM_READ

Страницы доступны для чтения

VM WRITE

Страницы доступны для записи

VM_EXEC

Страницы доступны для выполнения

VM_SHARED

Страницы доступны для совместного использования несколькими процессами

VM_MAYREAD

Флаг vm_read может быть установлен

VM_MAYWRITE

Флаг vmwrite может быть установлен

VM_MAYEXEC

Флаг vm exec может быть установлен

VM_MAYSHARE

Флаг vmjshare может быть установлен

VM_GROWSDOWN

Область может расширяться в направлении меньших адресов

VM_GROWSUP

Область может расширяться в направлении больших адресов

VM_SHM

Область применяется в качестве совместно используемой памяти в рамках IPC

VM_DENYWRITE

Область отображает файл, который не может быть открыт для записи

VM_EXECUTABLE

Область отображает исполняемый файл

VM LOCKED

Страницы области заблокированы и не могут быть выгружены

VM_IO

Область отображает адресное пространство ввода/вывода для некоторого устройства

VM_SEQ_READ

Приложение обращается к страницам последовательно

VM_RAND_READ

Приложение обращается к страницам в случайном порядке

VM_DONTCOPY

Не копировать область при ответвлении нового процесса

VM_DONT EX PAN D

Запретить расширение области с помощью системного вызова

mremap()

VM_RESERVED

Область является специальной (например, это адресное пространст­во ввода/вывода для некоторого устройства), поэтому страницы нель­зя выгружать

VM_ACCOUNT

Проверять, достаточно ли свободной памяти для отображения при создании области совместно используемой памяти IPC (см. главу 19)

VM_HUGETLB

Страницы в области обрабатываются механизмом выделения расширенных страниц

VM_NONLINEAR

Область реализует нелинейное отображение

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

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

Начальные значения флагов Таблицы Страниц (которые должны быть одинаковыми у всех страниц в области памяти, о чем мы уже говорили) хранятся в поле vmpageprot дескриптора vmareastruct. При добавлении страницы ядро устанавливает флаги в соответствующих записях Таблицы Страниц согласно содержимому поля vmpageprot.

Однако трансляция прав доступа к области памяти в биты защиты страницы не является простой операцией по ряду причин. В некоторых случаях попытка обращения к странице должна вызывать соответствующее исключение, даже если данный тип доступа прописан в поле vm_f lags дескриптора области памяти. Например, как мы увидим далее в этой главе, ядро может принять решение о хранении двух идентичных закрытых (то есть со сброшенными флагами vmshare) страниц, доступных для записи и принадлежащих двум разным процессам, в одном страничном кадре. В этом случае исключение должно быть сгенерировано, когда один из процессов попытается модифицировать страницу. Кроме того, у процессоров 80x86 Таблицы Страниц имеют всего два бита защиты, а именно флаги Read/Write И User/Supervisor. Флаг user/supervisor каждой страницы, входящей в область памяти, должен быть всегда установлен, потому что страница должна быть доступна процессам режима пользователя. Современные микропроцессоры Pentium 4 при включенном механизме выделения страниц РАЕ пользуются флагом nx (No eXecute, Выполнение запрещено) в каждой 64-битовой записи Таблицы Страниц.

Если ядро было откомпилировано без поддержки РАЕ, в Linux приняты следующие правила (они преодолевают аппаратные ограничения микропроцессоров 80x86):

  • право на чтение всегда подразумевает право на выполнение, и наоборот;

  • право на запись всегда подразумевает право на чтение.

Если же ядро было скомпилировано с поддержкой РАЕ, и у центрального процессора есть флаг nx, в Linux принимаются другие правила:

  • право на выполнение всегда подразумевает право на чтение;

  • право на запись всегда подразумевает право на чтение.

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

  • если для страницы определены права на запись и совместное использование, устанавливается бит Read/Write;

  • если для страницы определено право на чтение или выполнение, но не оп-

  • ределено право на запись или совместное использование, бит Read/write

  • сбрасывается;

  • если бит nx поддерживается процессором, а для страницы не определено

  • право на выполнение, бит nx устанавливается;

  • если для страницы не определено никаких прав доступа, бит Present сбрасывается, чтобы любая попытка обращения к ней вызывала соответствующее исключение. Однако чтобы отличать эту ситуацию от той, когда страница действительно отсутствует, в Linux устанавливается бит Page size.