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


Структуры данных

Linux пользуется отдельной buddy-системой для каждой зоны. Таким образом, в архитектуре 80x86 имеется три buddy-системы. Первая обрабатывает страничные кадры, подходящие для DMA-устройств, использующих шину ISA, вторая — нормальные” страничные кадры, а третья — страничные кадры из верхней памяти. Каждая buddy-система опирается в своей работе на следующие структуры данных:
- массив шеш шар, обсуждавшийся ранее. Фактически, каждая зона имеет дело с подмножеством элементов массива шеш шар. Первый элемент подмножества и количество элементов в подмножестве задаются, соответственно,
ПОЛЯМИ zопе_гпеш_тар И size дескриптора ЗОНЫ;
- массив, СОСТОЯЩИЙ ИЗ 1 1 элементов типа f гее_агеа, по одному для каждого размера группы. Этот массив хранится в поле f гее агеа дескриптора зоны.

Рассмотрим к-Й элемент массива free_area в дескрипторе зоны, который идентифицирует свободные блоки размера . Поле free list этого элемента является головой двунаправленного циклического списка, в котором собраны дескрипторы страниц, ассоциированные со свободными блоками из страниц. Точнее говоря, этот список включает в себя дескрипторы страниц, описывающие начальные страничные кадры каждого блока из 2 свободных страничных кадров. Указатели на соседние элементы списка хранятся в поле iru дескриптора страницы5.

Кроме ГОЛОВЫ списка, элемент массива free area содержит поле nr_free, которое задает количество свободных блоков размером в 2к страниц. Естественно, если блоков по свободных страничных кадров не существует, поле nr free равно 0, а список пуст (оба указателя в поле free list указывают на само это поле).

Наконец, поле private дескриптора первой страницы блока 2к свободных страниц хранит порядок блока, т. е. число к. Благодаря этому полю, когда блок страниц освобождается, ядро может определить, свободен ли buddy- блок этого блока, и, если это так, слить оба блока в один, состоящий из 2к+х страниц. Следует заметить, что вплоть до версии Linux 2.6 ядро работало с десятью массивами флагов для кодирования этой информации.

Предыдущая страница | 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...