Роберт Лав - Разработка ядра Linux
- Название:Разработка ядра Linux
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2006
- Город:Москва
- ISBN:5-8459-1085-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Роберт Лав - Разработка ядра Linux краткое содержание
В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.
Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.
Разработка ядра Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Структура 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
в этом адресном пространстве.
Флаги областей VMA
Поле флагов vm_flags
содержит битовые флаги, которые определены в файле . Они указывают особенности поведения и содержат описательную информацию о страницах памяти, которые входят в данную область памяти. В отличие от прав доступа, которые связаны с определенной физической страницей памяти, флаги областей VMA указывают особенности поведения, за которые отвечает ядро, а не аппаратное обеспечение. Более того, поле vm_flags
содержит информацию, которая относится к каждой странице в области памяти или, что то же самое, ко всей области памяти в целом. В табл. 14.1 приведен список возможных значений флагов vm_flags
.
Таблица 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
указывает, что область памяти не должна откачиваться на диск. Этот флаг также укалывается при отображении на память областей ввода-вывода аппаратных устройств.
Интервал:
Закладка: