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

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

Жанры

Разработка ядра 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
Не блокировать при операциях ввода-вывода
Поделиться:
Популярные книги

На границе империй. Том 3

INDIGO
3. Фортуна дама переменчивая
Фантастика:
космическая фантастика
5.63
рейтинг книги
На границе империй. Том 3

Целеполагание

Владимиров Денис
4. Глэрд
Фантастика:
фэнтези
боевая фантастика
рпг
5.00
рейтинг книги
Целеполагание

Осколки маски

Метельский Николай Александрович
7. Унесенный ветром
Фантастика:
боевая фантастика
альтернативная история
6.71
рейтинг книги
Осколки маски

Зеркало силы

Кас Маркус
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зеркало силы

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Инженер Петра Великого 4

Гросов Виктор
4. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Инженер Петра Великого 4

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Законы Рода. Том 4

Мельник Андрей
4. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 4

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Кукловод

Майерс Александр
4. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кукловод

Первый среди равных

Бор Жорж
1. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных

И.Бабель. Воспоминания современников

Паустовский Константин Георгиевич
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
И.Бабель. Воспоминания современников

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4