Книга: Разработка ядра Linux
Флаги областей VMA
Флаги областей VMA
Поле флагов vm_flags
содержит битовые флаги, которые определены в файле <linux/mm.h>
. Они указывают особенности поведения и содержат описательную информацию о страницах памяти, которые входят в данную область памяти. В отличие от прав доступа, которые связаны с определенной физической страницей памяти, флаги областей VMA указывают особенности поведения, за которые отвечает ядро, а не аппаратное обеспечение. Более того, поле vm_flags
содержит информацию, которая относится к каждой странице в области памяти или, что то же самое, ко всей области памяти в целом. В табл. 14.1 приведен список возможных значений флагов vm_flags
.
Таблица 14.1. Флаги областей VMA
Флаг | Влияние на область VMA и на ее страницы памяти |
---|---|
VM_READ |
Из страниц памяти можно считывать информацию |
VM_WRITE |
В страницы памяти можно записывать информацию |
VM_EXEC |
Можно выполнять код, хранящийся в страницах памяти |
VM_SHARED |
Страницы памяти являются совместно используемыми |
VM_MAYREAD |
Можно устанавливать флаг VM_READ |
VM_MAYWRITE |
Можно устанавливать флаг VM_WRITE |
VM_MAYEXEC |
Можно устанавливать флаг VM_EXEC |
VM_MAYSHARE |
Можно устанавливать флаг VM_SHARED |
VM_GROWSDOWN |
Область памяти может расширяться "вниз" |
VM_GROWSUP |
Область памяти может расширяться "вверх" |
VM_SHM |
Область используется для разделяемой (совместно используемой) памяти |
VM_DENYWRITE |
В область отображается файл, в который нельзя выполнять запись |
VM_EXECUTABLE |
В область отображается выполняемый файл |
VM_LOCKED |
Страницы памяти в области являются заблокированными |
VM_IQ |
В область памяти отображается пространство ввода-вывода аппаратного устройства |
VM_SEQ_READ |
К страницам памяти, вероятнее всего, осуществляется последовательный доступ |
VM_RAND_READ |
К страницам памяти, вероятнее всего, осуществляется случайный доступ |
VM_DONTCOPY |
Область памяти не должна копироваться при вызове fork() |
VM_DONTEXPAND |
Область памяти не может быть увеличена с помощью вызова remap() |
VM_RESERVED |
Область памяти не должна откачиваться на диск |
VM_ACCOUNT |
Область памяти является объектом, по которому выполняется учет ресурсов |
VM_HUGETLB |
В области памяти используются гигантские (hugetlb ) страницы памяти |
VM_NONLINEAR |
Область памяти содержит нелинейное отображение |
Рассмотрим подробнее назначение наиболее интересных и важных флагов. Флаги VM_READ
, VM_WRITE
и VM_EXEC
указывают обычные права на чтение-запись и выполнение для страниц памяти, которые принадлежат данной области памяти. При необходимости их можно комбинировать для формирования соответствующих прав доступа. Например, отображение выполняемого кода процесса может быть выполнено с указанием флагов VM_READ
и VM_EXEC
, но никак не с указанием флага VM_WRITE
. С другой стороны, сегмент данных из выполняемого файла может отображаться с указанием флагов VM_READ
и VM_WRITE
, указывать при этом флаг VM_EXEC
не имеет смысла. Файл данных, который отображается только для чтения, должен отображаться с указанием только флага VM_READ
.
Флаг VM_SHARED
указывает на то, что область памяти содержит отображение, которое может совместно использоваться несколькими процессами. Если этот флаг установлен, то такое отображение называют совместно используемым (shared mapping), что интуитивно понятно. Если этот флаг не установлен, то такое отображение доступно только одному процессу и оно называется частным отображением, (private mapping).
Флаг VM_IO
указывает, что область памяти содержит отображение области ввода-вывода аппаратного устройства. Этот флаг обычно устанавливается драйверами устройств при выполнении вызова mmap()
для отображения в память области ввода-вывода аппаратного устройства. Кроме всего прочего, этот флаг указывает, что область памяти не должна включаться в файл core процесса. Флаг VM_RESERVED
указывает, что область памяти не должна откачиваться на диск. Этот флаг также укалывается при отображении на память областей ввода-вывода аппаратных устройств.
Флаг VM_SBQ_READ
является подсказкой ядру, что приложение выполняет последовательное (т.е. линейное и непрерывное) чтение из соответствующего отображения. При этом ядро может повысить производительность чтения за счет выполнения упреждающего чтения (read-ahead) из отображаемого файла. Флаг VM_RAND_READ
указывает обратное, т.е. приложение выполняет операции чтения из случайно выбранных мест отображения (т.е. не последовательно). При этом ядро может уменьшить или совсем отключить выполнение упреждающего чтения из отображаемого файла. Эти флаги устанавливаются с помощью системного вызова madvice()
путем указания соответственно флагов MADV_SEQUENTIAL
и MADV_RANDOM
для этого вызова. Упреждающее чтение — это последовательное чтение несколько большего количества данных, чем было запрошено, в надежде на то, что дополнительно считанные данные могут скоро понадобиться. Такой режим полезен для приложений, которые считывают данные последовательно. Однако если считывание данных выполняется случайным образом, то режим упреждающего чтения не эффективен.
- Создание рабочих областей для документов из приложений Microsoft Office 2007
- Глава 8 Использование рабочих областей для собраний
- Флаги форматирования строк .NET
- Флаги gfp_mask
- Функция vmalloc()
- Операции с областями VMA
- Списки и деревья областей памяти
- Функция find_vma()
- Функция find_vma_prev()
- Функция find_vma_intersection()
- Управляющие флаги дескриптора безопасности
- Создание областей