Разработка ядра 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
рейтинг книги
Лишняя дочь
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Темный Лекарь 5
5. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Последний из рода Демидовых
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Чиновникъ Особых поручений
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Попаданка в академии драконов 4
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Боги, пиво и дурак. Том 6
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Курсант: Назад в СССР 10
10. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сделай это со мной снова
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Болотник 2
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Камень Книга двенадцатая
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Небо для Беса
3. Самбисты
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Надуй щеки! Том 4
4. Чеболь за партой
Фантастика:
попаданцы
уся
дорама
5.00