Linux Kernel (Ядро линукса) (часть 1)


Функция split_vma

Цель функции spiit_vma состоит в том, чтобы разбить область памяти, пересекающуюся с интервалом линейных адресов, на две меньшие, одну вне интервала, а другую — внутри него. Функция принимает четыре параметра: mm — указатель на дескриптор памяти; vma — указатель на дескриптор области памяти, который идентифицирует разбиваемую область; addr— адрес точки пересечения интервала и области памяти; new beiow— флаг, который показывает, произошло ли пересечение в начале или в конце интервала.

Функция выполняет следующие действия:

1. Вызывает функцию kmem_cache_aiioc, чтобы получить дополнительный дескриптор vm_area_struct, и сохраняет его адрес в локальной переменной new. Если свободной памяти нет, возвращает -enomem.
2. Инициализирует поля дескриптора new содержимым полей дескриптора
vma.
3. Если флаг new beiow сброшен, значит, интервал линейных адресов начинается внутри области vma, и, следовательно, новая область должна быть помещена после области vma. Функция записывает в поля new->vm_start и
vma->vm_end значение параметра addr.
4. Если же флаг new beiow установлен, значит, интервал линейных адресов заканчивается внутри области vma, и, следовательно, новая область должна быть помещена перед областью vma. Поэтому функция записывает в поле
new->vm_end И vma->vm_start значение параметра addr.
5. Если для новой области памяти определен метод open, функция выполняет его.
6. ЗаНОСИТ ДеСКрИПТОр Области ПаМЯТИ new В СПИСОК Областей mm->mmap и в красно-черное дерево mm->mm_rb. Кроме того, перестраивает дерево с учетом нового размера области памяти vma.
7. Возвращает 0 (успешное завершение).

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...