Функция 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 | Следующая страница