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 без проблем

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга для вас. А так как к книге прилагается компакт- диск с готовой к работе операционной системой Knoppix Live CD, то лишь достаточно вставить его в привод и перегрузить компьютер,...

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

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

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

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно неуклюже: получив системный вызов fork о, ядро в буквальном смысле дублировало все адресное пространство родителя и присваивало копию процессу-потомку. Такая операция...

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

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer head. Этот дескриптор содержит всю информацию, необходимую ядру для работы с блоком, так что перед обработкой блока ядро обязательно проверяет голову...