Когда я проверяю pagetypeinfoКак ядро Linux решает, какую область памяти использовать?
кошки/Proc/pagetypeinfo
Я вижу три типа зон памяти;
- DMA
- DMA32
- Нормальный
Как Linux выбрать зону памяти, чтобы выделить новую страницу?
Когда я проверяю pagetypeinfoКак ядро Linux решает, какую область памяти использовать?
кошки/Proc/pagetypeinfo
Я вижу три типа зон памяти;
Как Linux выбрать зону памяти, чтобы выделить новую страницу?
Для каждого запроса на распределение памяти (например, через kmalloc) на основе флагов, переданных функции, ядро выбирает зону памяти. эти запросы внутренне запускают функцию ядра alloc_pages().
zonelist является аргументом, который получает передается alloc_pages(), которые Указывает на zonelist структуры данных, описывающая, в порядке предпочтения, мембра- ORY зоны, пригодные для выделения памяти.
см главу управления памятью в книге Понимание ядра Linux
Эти зоны памяти определены только для 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
Это не совсем точная информация - зона DMA32 существует в архитектуре x86-64, и ее введение объясняется здесь: http://lwn.net/Articles/152337/ - в основном это эквивалентно DMA, используемому для драйверов, которые нуждаются в Это. Другое использование памяти ядра закончится в Normal, но перейдет в DMA32, если не хватает места (например, если есть только 3 ГБ, большая часть из них, скорее всего, будет в зоне DMA32, поэтому придется использовать это). – GreenReaper
Да, GreenReaper, я тоже это заметил. –
Это зависит от количества свободных страниц в каждой зоне, приоритет зон и узлом NUMA, связанный с процессором, который выдал запрос , См. Http://utcc.utoronto.ca/~cks/space/blog/linux/KernelMemoryZones и https://www.kernel.org/doc/Documentation/vm/numa. –