2013-08-05 2 views
2

Когда я проверяю pagetypeinfoКак ядро ​​Linux решает, какую область памяти использовать?

кошки/Proc/pagetypeinfo

Я вижу три типа зон памяти;

  • DMA
  • DMA32
  • Нормальный

Как Linux выбрать зону памяти, чтобы выделить новую страницу?

+0

Это зависит от количества свободных страниц в каждой зоне, приоритет зон и узлом NUMA, связанный с процессором, который выдал запрос , См. Http://utcc.utoronto.ca/~cks/space/blog/linux/KernelMemoryZones и https://www.kernel.org/doc/Documentation/vm/numa. –

ответ

0

Для каждого запроса на распределение памяти (например, через kmalloc) на основе флагов, переданных функции, ядро ​​выбирает зону памяти. эти запросы внутренне запускают функцию ядра alloc_pages().

zonelist является аргументом, который получает передается alloc_pages(), которые Указывает на zonelist структуры данных, описывающая, в порядке предпочтения, мембра- ORY зоны, пригодные для выделения памяти.

см главу управления памятью в книге Понимание ядра Linux

2

Эти зоны памяти определены только для 32-битных систем, а не в 64 бит.

Помните, что это ядро, доступное main memory, о котором мы говорим. В системе 32 bit (4 ГБ) разделение между ядром и пользовательским пространством составляет 1:3. Значение ядра может иметь доступ к 1 ГБ и пользовательскому пространству 3 ГБ. Ядро 1 ГБ разделено следующим образом:

Zone_DMA (0-16MB):Постоянно отображается в адресное пространство ядра.
По соображениям совместимости для более старых устройств ISA, которые могут обращаться только к нижней 16 МБ основной памяти.

Zone_Normal (16MB-896MB):Постоянно отображается в адресное пространство ядра.
Многие операции с ядром могут только происходят с использованием ZONE_NORMAL, поэтому это критическая зона с наибольшей производительностью и является памятью, в основном выделенной ядром.

ZONE_HIGH_MEM (896MB-above):не постоянно отображается в адресное пространство ядра.
Ядро может получить доступ к основной памяти 4 ГБ. ядро 1GB до Zone_DMA и 3GB пользователя от ZONE_HIGH_MEM. С Intel Physical Address Extension (PAE), один получает 4 дополнительных бита для обращения к основной памяти, что приводит к 36 бит, в общей сложности 64 ГБ памяти, к которым можно получить доступ. Дельта-адресное пространство (адрес 36 бит - 32-разрядный адрес) - это то, где ZONE_HIGH_MEM используется для сопоставления с основной памятью пользователя (т.е. между 2 ГБ - 4 ГБ).

Подробнее:

http://www.quora.com/Linux-Kernel/Why-is-there-ZONE_HIGHMEM-in-the-x86-32-Linux-kernel-but-not-in-the-x86-64-kernel
http://www.quora.com/Linux-Kernel/What-is-the-difference-between-high-memory-and-normal-memory
Linux 3/1 virtual address split

+1

Это не совсем точная информация - зона DMA32 существует в архитектуре x86-64, и ее введение объясняется здесь: http://lwn.net/Articles/152337/ - в основном это эквивалентно DMA, используемому для драйверов, которые нуждаются в Это. Другое использование памяти ядра закончится в Normal, но перейдет в DMA32, если не хватает места (например, если есть только 3 ГБ, большая часть из них, скорее всего, будет в зоне DMA32, поэтому придется использовать это). – GreenReaper

+0

Да, GreenReaper, я тоже это заметил. –

Смежные вопросы