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

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

Жанры

Разработка ядра 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. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь

Темный Лекарь 5

Токсик Саша
5. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 5

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Курсант: Назад в СССР 10

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

Сделай это со мной снова

Рам Янка
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сделай это со мной снова

Болотник 2

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

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая

Небо для Беса

Рам Янка
3. Самбисты
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Небо для Беса

Надуй щеки! Том 4

Вишневский Сергей Викторович
4. Чеболь за партой
Фантастика:
попаданцы
уся
дорама
5.00
рейтинг книги
Надуй щеки! Том 4