Чтение онлайн

на главную

Жанры

Разработка ядра Linux
Шрифт:

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

struct vm_area_struct {

 struct mm_struct *vm_mm; /* соответствующая структура mm_struct */

 unsigned long vm_start; /* начало диапазона адресов */

 unsigned long vm_end; /* конец диапазона адресов */

 struct vm_area_struct *vm_next; /* список областей VMA */

 pgprot_t vm_page_prot; /* права доступа */

 unsigned long vm_flags; /* флаги */

 struct rb_node vm_rb; /* узел текущей области VMA */

 union { /* связь с address_space->i_mmap, или i_mmap_nonlinear */

struct {

struct list_head list;

void *parent;

struct vm_area_struct *head;

} vm_set;

struct prio_tree_node prio_tree_node;

 } shared;

 struct list_head anon_vma_node; /*
анонимные области */

 struct anon_vma *anon_vma; /* объект анонимной VMA */

 struct vm_operations_struct *vm_ops; /* операции */

 unsigned long vm_pgoff; /* смещение в файле */

 struct file *vm_file; /* отображенный файл (если есть) */

 void *vm_private_data; /* приватные данные */

};

Как уже было рассказано, каждый дескриптор памяти связан с уникальным диапазоном (интервалом) адресов в адресном пространстве процесса. Поле vm_

start
 — это начальный (минимальный) адрес, а поле
vm_end
 — конечный (максимальный) адрес данного интервала. Следовательно, значение (
vm_end - vm_start
) — это размер (длина) интервала адресов в байтах. Интервалы адресов разных областей памяти одного адресного пространства не могут перекрываться.

Поле

vm_mm
указывает на структуру
mm_struct
, связанную с данной областью VMA. Заметим, что каждая область VMA уникальна для той структуры
mm_struct
, с которой эта область связана. Поэтому, даже если два разных процесса отображают один и тот же файл на свои адресные пространства, то для каждого процесса создается своя структура
vm_area_struct
, чтобы идентифицировать уникальные области памяти каждого процесса. Следовательно, два потока, которые совместно используют адресное пространство, также совместно используют и все структуры
vm_area_struct
в этом адресном пространстве.

Флаги областей 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
для этого вызова. Упреждающее чтение — это последовательное чтение несколько большего количества данных, чем было запрошено, в надежде на то, что дополнительно считанные данные могут скоро понадобиться. Такой режим полезен для приложений, которые считывают данные последовательно. Однако если считывание данных выполняется случайным образом, то режим упреждающего чтения не эффективен.

Поделиться:
Популярные книги

Санек 2

Седой Василий
2. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 2

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Без Чести

Щукин Иван
4. Жизни Архимага
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Без Чести

Безродный

Коган Мстислав Константинович
1. Игра не для слабых
Фантастика:
боевая фантастика
альтернативная история
6.67
рейтинг книги
Безродный

Огненный князь

Машуков Тимур
1. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Огненный князь

Ваше Сиятельство 4т

Моури Эрли
4. Ваше Сиятельство
Любовные романы:
эро литература
5.00
рейтинг книги
Ваше Сиятельство 4т

Вторая невеста Драконьего Лорда. Дилогия

Огненная Любовь
Вторая невеста Драконьего Лорда
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Вторая невеста Драконьего Лорда. Дилогия

Кодекс Крови. Книга V

Борзых М.
5. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга V

Девятое правило дворянина

Герда Александр
9. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Девятое правило дворянина

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание

Скрываясь в тени

Мазуров Дмитрий
2. Теневой путь
Фантастика:
боевая фантастика
7.84
рейтинг книги
Скрываясь в тени

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Идеальный мир для Лекаря 3

Сапфир Олег
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 3

Под маской, или Страшилка в академии магии

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.78
рейтинг книги
Под маской, или Страшилка в академии магии