Области памяти
Области памяти
Области памяти (memory areas) представляются с помощью объектов областей памяти, которые хранятся в структурах типа vm_area_struct. Эта структура определена в файле <linux/mm.h>. Области памяти часто называются областями виртуальной памяти (virtual memory area, или VMA).
Структура vm_area_struct описывает одну непрерывную область памяти в данном адресном пространстве. Ядро рассматривает каждую область памяти, как уникальный объект. Для каждой области памяти определены некоторые общие свойства, такие как права доступа и набор соответствующих операций. Таким образом, одна структура VMA может представлять различные типы областей памяти, например файлы, отображаемые в память, или стек пространства пользователя. Это аналогично объектно-ориентированному подходу, который используется в подсистеме VFS (см. главу 12, "Виртуальная файловая система").
Ниже показана эта структура данных с комментариями, описывающими назначение каждого поля.
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 в этом адресном пространстве.