2012-05-14 11 views
3

На 32-битной платформе x86, если vmalloc() может выделять память из ZONE_NORMAL или ZONE_HIGHMEM, означает ли это, что даже если я увеличиваю ZONE_HIGHMEM, фактический общий диапазон, который может использовать vmalloc(), не изменяется? Я сделал тест для увеличения ZONE_HIGHMEM, однократное выделение vmalloc() может быть намного больше, чем раньше. Значит ли это, что vmalloc() фактически выделяет память только из ZONE_HIGHMEM?Имеет ли vmalloc() только память от ZONE_HIGHMEM на 32-битной x86?

ответ

6

vmalloc предпочитает ZONE_HIGHMEM, если он существует, но может вернуться на ZONE_NORMAL.

Однако на машине с 1 ГБ или более (то есть на любой современной машине) vmalloc ограничен виртуальной памятью (область vmalloc), а не физической памятью.
В таком случае область vmalloc составляет 128 МБ (если не увеличена на vmalloc_reserve), а ZONE_HIGHMEM - это то, что плюс память выше 1 ГБ - обычно намного больше.

Что вы увеличиваете, фактически является областью виртуальной памяти vmalloc, а ее увеличение позволяет вам vmalloc. Это косвенно увеличивает ZONE_HIGHMEM, но это не очень импотентное.