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


Добавление страницы

Функция add to page cache заносит дескриптор новой страницы в кэш страниц. В качестве параметров она принимает адрес раде дескриптора страницы, адрес mapping объекта address space, значение offset, представляющее индекс страницы внутри адресного пространства, и флаги выделения памяти gfp mask, используемые при выделении новых узлов базисного дерева. Функция выполняет следующие действия:
1. Вызывает функцию radix tree preioad , которая отключает вытеснение в ядре и записывает в процессорную переменную radix tree preioads несколько структур radix tree node. Выделение структур radix tree node происходит за счет кэша slab-аллокатора radix_tree_node_cachep. Если функции radix tree preioad не удается ВЫДеЛИТЬ структуры radix_tree_ node, функция add to page cache завершается с кодом возврата -ENOMEM. В противном случае, если функция radix tree preioad завершилась успешно, вызвавшая ее функция add to page cache может быть уверена,
что занесение в кэш нового дескриптора страницы не провалится” из-за нехватки памяти, по крайней мере, для файлов размером до 64 Гбайт.
2. Получает спин-блокировку mapping->tree_iock. Обратите внимание, что вытеснение В ядре уже ОТКЛЮЧенО функцией radix_tree_preload .
3. Вызывает функцию radix tree insertо, чтобы вставить в дерево новый узел. Эта функция выполняет следующие действия:
• вызывает функцию radix_tree_maxindex, чтобы ПОЛучИТЬ макси- мальный индекс, который может быть вставлен в базисное дерево при его текущей высоте. Если индекс новой страницы не может быть представлен в дереве такой высоты, функция вызывает radix_tree_ extend , чтобы увеличить высоту дерева за счет добавления необходимого количества узлов a, функция radix_tree_extend ДО- бавит еще один узел сверху). Новые узлы выделяются функцией radix_tree_node_alloc(), КОТОрая пытается ПОЛучИТЬ структуру radix tree node из кэша slab-аллокатора или, если не удастся, из пула заранее выделенных структур, хранящихся в radix tree preioads;
• начиная с корня (mapping->page_tree), функция совершает обход дерева в соответствии с индексом страницы offset, пока не достигнет нужного узла, как описано в предыдущем разделе. Если потребуется, она выделит новые промежуточные узлы, вызывая функцию
radix_tree_node_alloc;
• сохраняет дескриптор страницы в соответствующем слоте последнего пройденного ею узла базисного дерева и возвращает 0.
4. Увеличивает счетчик обращений page->_count дескриптора страницы.
5. Поскольку это новая страница, ее содержимое не действительно. Функция устанавливает флаг PG iocked страничного кадра, чтобы защитить страницу от обращения со стороны других управляющих трактов ядра.
6. Инициализирует поля page->mapping и page->index значениями параметров mapping И offset.
7. Увеличивает счетчик кэшированных страниц в адресном пространстве
(mapping->nrpages).
8. Освобождает спин-блокировку адресного пространства.
9. Вызывает radix tree preioad end , чтобы опять включить вытеснение в ядре.
10. Возвращает 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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




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

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

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

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

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

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

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

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

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