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


Зоны памяти

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

Однако реальные компьютерные архитектуры имеют аппаратные ограничения, которые могут повлиять на способы использования страничных кадров. В частности, ядро Linux может столкнуться с двумя аппаратными ограничениями в архитектуре 80x86:
- процессоры DMA для старой шины ISA имеют очень сильное ограничение, они могут обращаться только к первым 16 Мбайт оперативной памяти;
- в современных 32-разрядных компьютерах с огромными объемами оперативной памяти процессор не может напрямую обращаться ко всей физической памяти из-за того, что линейное адресное пространство слишком мало.
Чтобы преодолеть эти два ограничения, в Linux физическая память каждого узла памяти разделена на три зоны. В архитектуре 80x86 с моделью UMA эти зоны такие:
- zone dma— содержит страничные кадры памяти ниже 16 Мбайт;
- zone normal— содержит страничные кадры памяти от 16 Мбайт (включительно) до 896 Мбайт;
- zone highmem — содержит страничные кадры памяти от 896 Мбайт (включительно) и выше.

Зона zone dma содержит страничные кадры, к которым старые устройства на основе шины ISA могут обращаться средствами DMA Зоны zone dma и zone normal включают в себя "нормальные" страничные кадры, к которым ядро может обратиться напрямую, при помощи линейного отображения в четвертый гигабайт пространства линейных адресов. Зато zone highmem содержит страничные кадры, к которым ядро не может обратиться напрямую, при помощи линейного отображения в четвертый гигабайт пространства линейных адресов . В 64-разрядных архитектурах зона zone highmem всегда пуста.

Каждая зона памяти имеет дескриптор типа zone. Многие поля структуры zone используются при утилизации страничных кадров. Каждый дескриптор страницы имеет ссылки на узел памяти и на зону внутри узла, где содержится соответствующий страничный кадр. Для экономии места эти ссылки хранятся не как классические указатели, а закодированы в виде индексов и находятся в старших битах поля flags. Поскольку количество флагов, характеризующих страничный кадр, ограничено, всегда имеется возможность зарезервировать старшие биты поля flags для кодирования узла памяти и номера зоны3. Функция page_zone принимает в качестве параметра адрес дескриптора страницы. Она читает старшие биты поля flags этого дескриптора, а затем определяет адрес соответствующего дескриптора зоны, просматривая массив zone tabie. Этот массив инициализируется на этапе загрузки системы; в него записываются адреса всех дескрипторов зон всех узлов памяти.

Когда ядро вызывает функцию выделения памяти, оно должно указать зоны, содержащие запрошенные страничные кадры. Ядро обычно сообщает, какие зоны оно хочет использовать. Например, если страничный кадр должен быть напрямую отображен в четвертый гигабайт линейных адресов, но не будет использован в пересылке данных средствами DMA с использованием шины ISA, то ядро запрашивает страничный кадр либо в зоне zone normal, либо в зоне zone dma. Конечно, страничный кадр должен быть выделен в зоне zone dma, только если в зоне zone normal нет свободных страничных кадров.

Чтобы задать предпочтительные зоны в запросе на выделение памяти, ядро пользуется структурой zoneiist, являющейся массивом указателей на дескрипторы зон.

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