Главная » Ядро Linux » Управление памятью в ядре Linux

0

Таблица 11.1 . Зоны памяти для аппаратной платформы х86

Зона

Описание

физическая память

ZONE_DM A ZONE_NORMA L ZONE_HIGHME M

Страницы памяти, совместимые  с ПДП Нормально  адресуемые страницы  Динамически отображаемые страницы

<  16 Мбайт

16 896  Мбайт

> 896 Мбайт

Операционная система  разделяет страницы системной  памяти  на  зоны,  чтобы иметь  пулы  страниц для  удовлетворения требований выделения  памяти.  Например, пул  зоны   ZONE_DMA дает  возможность ядру удовлетворить  запрос   на  выделение памяти, которая необходима для  операций DMA.  Если  нужна  такая  память, ядро  может просто  выделить необходимое количество страниц из  зоны   ZONE_DMA. Следует  обратить  внимание, что  зоны  не  связаны с аппаратным  обеспечением— это  логическое группирование,  которое позволяет ядру  вести  учет  страниц; памяти.

Хотя   некоторые  запросы  на  выделение  памяти  могут  требовать   страниц ы  из определенной зоны, это  требование не  обязательно может  быть жестким. Например, выделение памяти для  ПДП  требует  страницы из  зоны   ZONE  DMA, а для  обычного выделения памяти могут  подойти страницы как  из зоны  ZONE_NORMAL, так и из зоны ZONE_DMA.  Конечно, для удовлетворения запросов по  обычному выделению памяти ядро  будет  стараться выделять страницы  из  зоны   ZONE_NORMAL,  чтобы  сохранить страницы в  зоне  ZONE_DMA для  случая, когда  эти  страницы  действительно нужны, Если   же  наступает решающий  момент   (становится  недостаточно памяти),  то  ядро может  обратиться к любой  доступной и  подходящей зоне.

1  Некоторы е некачественные устройства PCI  также  могут выполнять прямо й доступ к памяти только к 24-битовом адресном пространстве. Но  эти устройства работают не правильно.

2  Это не имеет  ничего  общего  с верхней памятью в операционно й системе  DOS.

Каждая зона  представлена с помощью структуры  struc t    zone, которая определена  в файле  <linux/mmzone.h> в следующем виде.

struct zone {

spinlock t               lock; unsigned ]ong            free_pages; unsigned long           pages_min; unsigned long           pages_low; unsigned long            pages_high;

unsigned long            protection[MAX_NR_ZONES];

spinlock_t              lru_lock; struct list_head          active_list; struct list_head         inactive_list; unsigned long            nr_scan_active; unsigned long            nr_scan_inactive; unsigned long           nr_active; unsigned long             nr_inactive;

int                     all_unreclaimable;

unsigned long            pages_scanned; int                       temp_priority; int                     prev_priority;

struct free_area         free_area[MAX_ORDER];

wait_queue_head_t       *wait_table; unsigned long            wait_table_size; unsigned long           wait_table_bits; struct per_cpu_pageset   pageset[NR_CPUS]; struct pglist_data       *zone_pgdat; struct page               *zone_mem_map; unsigned long            zone_start_pfn; char                    *name;

unsigned long            spanned_pages;

unsigned long           prcsent_pages;

};

Эта структура  большая, но в системе  всего три зоны  и соответственно три такие структуры.  Рассмотрим наиболее важные  поля  данной структуры.

Поле  lock— это  спин-блокировка,  которая защищает структуру  от параллельного доступа.  Обратите внимание, что она защищает только  структуру, а не страницы, которые принадлежат зоне.  Для  защиты  отдельных страниц нет блокировок,  хотя отдельные части  кода  могут блокировать данные, которые могут оказаться в указанных страницах.

Поле  free_pages  — это количество свободных страниц в соответствующей зоне. Ядро  старается поддерживать свободными хотя бы pages_min  страниц зоны, если это возможно (например, с помощью вытеснения на диск).

Поле  name— это строка, оканчивающаяся нулем, которая содержит имя  соответствующей  зоны  (что не удивительно). Ядро  инициализирует указанное поле  при  загрузке  системы с помощью кода, который описан п файле  mm/page_alloc.с. Три зоны  имеют  имена  "DMA", "Normal"  и "HighMem".

Источник: Лав,  Роберт. Разработка ядра  Linux, 2-е  издание. : Пер.  с англ.  — М.  : ООО  «И.Д.  Вильяме» 2006. — 448 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии