Области памяти

Области памяти

Области памяти (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 в этом адресном пространстве.