Области памяти
Области памяти
Области памяти (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 в этом адресном пространстве.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Области памяти в реальной жизни
Области памяти в реальной жизни Рассмотрим пример адресного пространства процесса и области памяти в этом адресном пространстве. Для этой цели можно воспользоваться полезной файловой системой /proc и утилитой pmар(1). В качестве примера рассмотрим следующую простую
Знание предметной области
Знание предметной области Каждый профессионал обязан понимать предметную область программируемых им решений. Если вы пишете бухгалтерскую систему, вы должны разбираться в бухгалтерии. Если вы пишете приложение для туристической фирмы, вы должны разбираться в туризме.
Области данных
Области данных Области данных содержат записи базы данных. Все записи одной области данных схожи: однородны и имеют фиксированную длину. Записи хранятся в порядке их поступления, и все удаленные записи по-прежнему занимают место.Объект «область данных» состоит из
Индексы области данных
Индексы области данных Индекс области данных задает альтернативный порядок записей в области данных. Для альтернативного упорядочения используется дерево с двоичным основанием. В разделе «Деревья с двоичным основанием» мы рассмотрим такое дерево и его использование
Области
Области В SCO UNIX адресное пространство процесса разделено на несколько участков, называемых областями (region). Область представляет собой непрерывный участок виртуального адресного пространства процесса, который рассматривается ядром системы как отдельный объект,
6.5.2 Выделение области
6.5.2 Выделение области Ядро выделяет новую область (по алгоритму allocreg, Рисунок 6.18) во время выполнения системных функций fork, exec и shmget (получить разделяемую память). Ядро поддерживает таблицу областей, записям которой соответствуют точки входа либо в списке свободных
6.5.5 Загрузка области
6.5.5 Загрузка области В системе, где поддерживается подкачка страниц по обращению, ядро может «отображать» файл в адресное пространство процесса во время выполнения функции exec, подготавливая последующее чтение по запросу отдельных физических страниц (см. главу 9). Если же
6.5.6 Освобождение области
6.5.6 Освобождение области Если область не присоединена уже ни к какому процессу, она может быть освобождена ядром и возвращена в список свободных областей (Рисунок 6.25). Если область связана с индексом, ядро освобождает и индекс с помощью алгоритма iput, учитывая значение
Определение области
Определение области Как правило, для определения областей в файлы krb5.conf и kdc.conf включаются специальные записи. Отредактировав файл, рассмотренный выше в качестве примера, вы измените конфигурацию KDC, серверов приложений и клиентов. Для того чтобы изменения были учтены
Администрирование области
Администрирование области Отредактировав конфигурационные файлы Kerberos и вызвав kdb5_util для создания основного ключа и инициализации базы данных Kerberos, можно приступать к администрированию области. Этот процесс в основном сводится к определению принципалов. Для выполнения
Области с прокруткой
Области с прокруткой Класс QScrollArea содержит область отображения, которую можно прокручивать, и две полосы прокрутки. Если мы хотим добавить в виджет полосы прокрутки, значительно проще использовать класс QScrollArea, чем создавать свои собственные экземпляры QScrollBar и самим
Области применения. NET
Области применения. NET Как и было заявлено Microsoft с самого начала обнародования сведений о. NET, этот набор технологий в первую очередь адресован программистам, которые работают с веб-приложениями, и предназначен для создания расширяемых распределенных приложений, которые,
Области значений
Области значений Область значений — это интервал от минимального до максимального значения, которое может быть представлено в переменной данного типа. В таблице 3.3 приведен размер занимаемой памяти и области значений переменных для каждого типа. Поскольку переменных
Области
Области CombineRgn Функция CombineRgn объединяет две области и сохраняет результат в третьей. Две области объединяются согласно указанному режиму объединения. int CombineRgn ( HRGN hrgnDest , // дескриптор результирующей области HRGN hrgnSrc 1 , // дескриптор исходной области HRGN hrgnSrc 2 , // дескриптор