Вход/Регистрация
Разработка ядра Linux
вернуться

Лав Роберт

Шрифт:

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

Операции с областями VMA

Поле

vm_ops
структуры
vm_area_struct
содержит указатель на таблицу операций, которые связаны с данной областью памяти и которые ядро может вызывать для манипуляций с областью VMA. Структура
vm_area_struct
служит общим объектом для представления всех типов областей виртуальной памяти, а в таблице операций описаны конкретные методы, которые могут быть применены к каждому конкретному экземпляру объекта.

Таблица операций представлена с помощью структуры

vm_operations_struct
, которая определена в файле
<linux/mm.h>
следующим образом.

struct vm_operations_struct {

 void (*open)(struct vm_area_struct*);

 void (*close)(struct vm_area_struct*);

 struct page* (*nopage)(struct vm_area_struct*, unsigned long, int);

 int (*populate)(struct vm_area struct*, unsigned long,

unsigned long, pgprot_t, unsigned long, int);

};

Рассмотрим каждый метод в отдельности.

• 

void open(struct vm_area_struct *area);

Эта функция вызывается, когда соответствующая область памяти добавляется в адресное пространство.

• 

void close(struct vm_area_struct *area);

Эта функция вызывается, когда соответствующая область памяти удаляется из адресного пространства.

• 

struct page* nopage(struct vm_area_struct *area,

unsigned long address, int unused);

Эта функция вызывается обработчиком прерывания из-за отсутствия страницы (page fault), когда производится доступ к странице, которая отсутствует в физической памяти.

• 

int populate(struct vm_area_struct *area,

unsigned long address, unsigned long len, pgprot_t prot,

unsigned long pgoff, int nonblock);

Эта функция вызывается из системного вызова

remap_pages
для предварительного заполнения таблиц страниц области памяти (prefault) при создании нового отображения.

Списки и деревья областей памяти

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

mmap
и
mm_rb
. Эти две структуры данных независимо друг от друга указывают на все области памяти, связанные с данным дескриптором памяти. Они содержат указатели на одни и те же структуры
vm_area_struct
, просто эти указатели связаны друг с другом по-разному.

  • Читать дальше
  • 1
  • ...
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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