Чтение онлайн

на главную - закладки

Жанры

Разработка ядра Linux
Шрифт:

Если кэш не содержит нужную область VMA, то функция должна выполнять поиск по красно-черному дереву. Это выполняется путем проверки узлов дерева. Если значение поля

vma_end
для области памяти текущего узла больше
addr
, то текущим становится левый дочерний узел, в противном случае — правый. Функция завершает свою работу, как только находится область памяти, которая содержит адрес
addr
. Если такая область VMA не найдена, то функция продолжает поиск по дереву и возвращает ту область памяти, которая начинается после адреса
addr
. Если вообще не найдена ни одна область памяти, то возвращается значение
NULL
.

Функция

find_vma_prev

Функция

find_vma_prev
работает аналогично функции
find_vma
, но дополнительно она еще возвращает последнюю область VMA, которая заканчивается перед адресом
addr
. Эта функция также определена в файле
mma/mmap.c
и объявлена в файле
<linux/ram.h>
следующим образом.

struct vm_area_struct* find vma_prev(struct mm_struct *mm,

 unsigned long addr, struct vm_area_struct **pprev);

Параметр

pprev
после возвращения из функции содержит указатель на предыдущую область VMA.

Функция

find_vma_intersection

Функция

find_vma_intersection
возвращает первую область памяти, которая перекрывается с указанным интервалом адресов. Эта функция определена в файле
<linux/mm.h>
следующим образом. Это функция с подстановкой тела.

static inline struct vm_area_struct* find_vma_intersection(

 struct mm_struct *mm, unsigned long start_addr,

 unsigned long end_addr) {

 struct vm_area_struct *vma;

 vma = find_vma(mm, start_addr);

 if (vma && end_addr <= vma->vm_start)

vma = NULL;

 return vma;

}

Первый параметр — адресное пространство, в котором выполняется поиск, параметр

start_addr
— это первый адрес интервала адресов, а параметр
end_addr
 — последний адрес интервала.

Очевидно, что если функция

find_vma
возвращает значение
NULL
, то это же значение будет возвращать и функция
find_vma_intersection
. Если функция
find_vma
возвращает существующую область VMA, то функция
find_vma_intersection
возвратит ту же область только тогда, когда эта область не начинается после конца данного диапазона адресов. Если область памяти, которая возвращается функцией
find_vma
, начинается после последнего адреса из указанного диапазона, то функция
find_vma_intersection
возвращает значение
NULL
.

Функции

mmap
и
do_mmap
: создание интервала адресов

Функция

do_mmap
используется ядром для создания нового линейного интервала адресов. Говорить, что эта функция создает новую область VMA, — технически не корректно, поскольку если создаваемый интервал адресов является смежным с существующим интервалом адресов и у этих интервалов одинаковые права доступа, то два интервала объединяются в один. Если это невозможно, то создается новая область VMA В любом случае функция
do_mmap
— это функция, которая добавляет интервал адресов к адресному пространству процесса, независимо от того, создается ли при этом новая область VMA или расширяется существующая.

Функция

do_mmap
объявлена в файле
<linux/mm.h>
следующим образом.

unsigned long do_mmap(struct file *file,

 unsigned long addr, unsigned long len,

 unsigned long prot,
unsigned long flag,

 unsigned long offset);

Эта функция выполняет

отображение на память содержимого файла
file
начиная с позиции в файле
offset
; размер отображаемого участка равен
len
байт. Значения параметров
file
и
offset
могут быть нулевыми, в этом случае отображение не будет резервироваться (сохраняться) в файле. Такое отображение называется анонимным (anonymous mapping). Если указан файл и смещение, то отображение называется отображением файла в память (file-backed mapping).

Параметр

addr
указывает (точнее, всего лишь подсказывает), откуда начинать поиск свободного интервала адресов.

Параметр

prot
указывает права доступа для страниц памяти в данной области. Возможные значение флагов зависят от аппаратной платформы и описаны в файле
<asm/mman.h>
. Хотя на практике для всех аппаратных платформ определены флаги, приведенные в табл. 14.2.

Таблица 14.2. Флаги защиты страниц памяти

Флаг Влияние на страницы памяти в созданном интервале адресов
PROT_READ
Соответствует флагу
VM_READ
PROT_WRITE
Соответствует флагу
VM_WRITE
PROT_EXEC
Соответствует флагу
VM_EXEC
PROT_NONE
К страницам памяти нет доступа

Параметр

flags
позволяет указать все остальные флаги области VMA Эти флаги также определены в
<asm/mman.h>
и приведены в табл. 14.3.

Таблица 14.3. Флаги защиты страниц памяти

Флаг Влияние на созданный интервал адресов
MAP_SHARED
Отображение может быть совместно используемым
MAP_PRIVATE
Отображение не может быть совместно используемым
MAP_FIXED
Создаваемый интервал адресов должен начинаться с указанного адреса
addr
MAP_ANONYMOUS
Отображение является анонимным, а не отображением файла
MAP_GROWSDOWN
Соответствует флагу
VM_GROWSDOWN
MAP_DENYWRITE
Соответствует флагу
VM_DENYWRITE
MAP_EXECUTABLE
Соответствует флагу
VM_EXECUTABLE
MAP_LOCKED
Соответствует флагу
VM_LOCKED
MAP_NORESERVE
Нет необходимости резервировать память для отображения
MAP_POPULATE
Предварительно заполнить (prefault) таблицы страниц
MAP_NONBLOCK
Не блокировать при операциях ввода-вывода
Поделиться:
Популярные книги

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Кодекс Охотника. Книга XIV

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Штуцер и тесак

Дроздов Анатолий Федорович
1. Штуцер и тесак
Фантастика:
боевая фантастика
альтернативная история
8.78
рейтинг книги
Штуцер и тесак

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI

Болотник

Панченко Андрей Алексеевич
1. Болотник
Фантастика:
попаданцы
альтернативная история
6.50
рейтинг книги
Болотник

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Жестокая свадьба

Тоцка Тала
Любовные романы:
современные любовные романы
4.87
рейтинг книги
Жестокая свадьба

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Голодные игры

Коллинз Сьюзен
1. Голодные игры
Фантастика:
социально-философская фантастика
боевая фантастика
9.48
рейтинг книги
Голодные игры

Последняя Арена 8

Греков Сергей
8. Последняя Арена
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Последняя Арена 8

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Измена. Свадьба дракона

Белова Екатерина
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Измена. Свадьба дракона