Флаг 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
для этого вызова. Упреждающее чтение — это последовательное чтение несколько большего количества данных, чем было запрошено, в надежде на то, что дополнительно считанные данные могут скоро понадобиться. Такой режим полезен для приложений, которые считывают данные последовательно. Однако если считывание данных выполняется случайным образом, то режим упреждающего чтения не эффективен.
Поле vm_ops
структуры vm_area_struct
содержит указатель на таблицу операций, которые связаны с данной областью памяти и которые ядро может вызывать для манипуляций с областью VMA. Структура vm_area_struct
служит общим объектом для представления всех типов областей виртуальной памяти, а в таблице операций описаны конкретные методы, которые могут быть применены к каждому конкретному экземпляру объекта.
Таблица операций представлена с помощью структуры vm_operations_struct
, которая определена в файле следующим образом.
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
, просто эти указатели связаны друг с другом по-разному.
Первый контейнер, поле mmap
, объединяет все объекты областей памяти в односвязный список. Структуры vm_area_struct
объединяются в список с помощью своих полей vm_next
. Области памяти отсортированы в порядке увеличения адресов (от наименьшего и до наибольшего). Первой области памяти соответствует структура vm_area_struct
, на которую указывает само поле mmap
. Указатель на самую последнюю структуру равен значению NULL
.
Читать дальше