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


Зонный аллокатор страничных кадров

Подсистема ядра, обрабатывающая запросы на выделение памяти, имеющие отношение к группам смежных страничных кадров, называется зонным аллокатором страничных кадров.

Компонент под названием "аллокатор зон” получает запросы на выделение и освобождение динамической памяти. Приняв запрос на выделение памяти, он ищет зону, содержащую группу смежных страничных кадров, которая могла бы удовлетворить запрос. Внутри каждой зоны страничные кадры обрабатываются компонентом, называемым buddy-системой. В целях повышения производительности небольшое количество страничных кадров содержится в кэше, позволяющем быстро удовлетворить запросы на выделение единичных страничных кадров.

Запрашивание и освобождение страничных кадров

Страничные кадры запрашиваются с помощью шести слегка различающихся функций и макросов.

Если не оговорено обратное, то они возвращают линейный адрес первой выделенной страницы или null в случае неудачи:

- alloc pages (gfp mask, order) — макрос ИСПОЛЬЗуетСЯ ДЛЯ Запроса Смежных страничных кадров, количество кадров равно двум в степени order. Он возвращает адрес дескриптора первого выделенного страничного кадра или null, если выделение завершилось неудачей;
- aiioc page(gfp mask) — макрос используется для получения одного стра- ничного кадра. Он расширяется в вызов:
alloc_pages(gfp_mask, 0)
Возвращает адрес дескриптора первого выделенного страничного кадра или null, если выделение завершилось неудачей;
- get free pages (gfp mask, order) — функция аналогична макросу а11ос_
pages , но возвращает линейный адрес первой выделенной страницы;
- get free page (gfp mask) — макрос ИСПОЛЬЗуетСЯ ДЛЯ получения ОДНОГО
страничного кадра. Он расширяется в вызов:
get_free_pages(gfp_mask, 0)
- get zeroed page (gfp mask) — функция ИСПОЛЬЗуетСЯ ДЛЯ получения СТра- ничного кадра, заполненного нулями. Она делает следующий вызов:
alloc_pages(gfp_mask | GFP_ZERO, 0)
и возвращает линейный адрес выделенного страничного кадра;
- get dma pages (gfp mask, order) — макрос ИСПОЛЬЗуетСЯ ДЛЯ получения
страничных кадров, подходящих для DMA. Он расширяется в вызов:
get_free_pages(gfp_mask | GFP_DMA, order)
Параметр gfp mask представляет группу флагов, определяющих способ поиска свободных страничных кадров. Флаги, которые можно использовать в параметре gfp maskНа практике в операционной системе Linux применяются комбинации флагов, Имя группы — это аргумент, передаваемый функциям выделения страниц, описанным ранее в этом разделе.

Флаги gfp dma и gfp highmem называются модификаторами зоны. Ониопределяют, в какой зоне ядро ищет свободные страничные кадры. Поле node zonelists дескриптора узла contig page data ЯВЛЯетСЯ массивом СПИСКОВ, включающих в себя дескрипторы зон, представляющие зоны отступления. Для любого значения модификаторов зон соответствующий список содержит зоны, которые можно использовать для удовлетворения запроса на память, если в первоначально указанной зоне недостаточно страничных кадров. В архитектуре 80x86 с поддержкой UMA приняты следующие зоны отступления:
- если флаг gfp dma установлен, страничные кадры можно брать только из
зоны zone_dma;
- в противном случае, и если не установлен флаг gfp highmem, страничные
кадры можно брать только из зон zone normal и zone dma, указанных здесь в порядке предпочтения;
- в противном случае (флаг gfp highmem установлен), страничные кадры
можно брать из зон zone_highmem, zone_normal и zone_dma, в порядке предпочтения.

Страничные кадры можно освобождать с помощью следующих функций и макросов:
- free pages (page, order) — Эта фуНКЦИЯ проверяет дескриптор СТранИ-
цы, на который указывает параметр раде. Если данный страничный кадр не зарезервирован (то есть флаг PG reserved равен 0), функция уменьшает поле count дескриптора. Если значение count стало равно 0, функция считает, что смежные страничные кадры (количестве кадров равно двум в степени order), начиная с того, на который указывает параметр раде, больше не используются.
- free pages (addr, order) — эта фуНКЦИЯ аналогична фуНКЦИИ
f ree pages , но в качестве первого параметра она принимает линейный
адрес addr первого страничного кадра, подлежащего освобождению;
- free_page (page) — этот макрос освобождает страничный кадр, на который указывает параметр раде. Макрос расширяется в free pages (раде, 0);
- free page (addr) — этот макрос освобождает страничный кадр с линейным адресом addr. Макрос расширяется В free pages (addr, 0).

Отображение ядром страничных кадров верхней памяти

Линейный адрес, соответствующий концу напрямую отображенной физической памяти и, следовательно, началу верхней памяти, хранится в перемен
ной high memory, значение которой равно 896 Мбайт. Страничные кадры выше 896-мегабайтной границы, вообще говоря, не отображаются в четвертый гигабайт линейного адресного пространства ядра, и оно не может обращаться к ним непосредственно. Это означает, что никакая функция аллокатора страниц, возвращающая линейный адрес выделенного страничного кадра, не работает со страничными кадрами из верхней памяти, т. е. из зоны.

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