2013-08-20 2 views
2

Зачем нам требовать, чтобы alloc_pages() возвращал указатель на страницу структуры в отличие от другой функции распределения памяти (get_free_pages(), kmalloc())? Пожалуйста, предоставьте прецедент. Связано ли это с распределением зоны HIGHMEM?Разница между возвращаемыми значениями alloc_pages() и get_free_pages()

ответ

2

alloc_pages(mask, order) выделяет страницы 2order и возвращает экземпляр страницы структуры для представления начала зарезервированного блока. alloc_page (mask) - более короткая нотация для порядка = 0, если запрашивается только одна страница.

__get_free_pages(mask, order) and __get_free_page(mask) работают так же, как и функции , но возвращают виртуальный адрес зарезервированного фрагмента памяти вместо экземпляра страницы.

kmalloc(size, mask) резервирует область памяти размера байтов и возвращает указатель на пустоту в начале области. Если недостаточно памяти (очень маловероятная ситуация в ядре, но она должна всегда обслуживаться), результатом является нулевой указатель.

маскирующего также указывает сведения о запросе:

• memory zone 
• behavior of allocator (blocking/unblocking request, etc.) 
• e.g. GFP_KERNEL, GFP_ATOMIC, GFP_DMA, etc 

alloc_pages() and __get_free_pages() : allocate pages, at low level

kmalloc() : allocate physically contiguous sequence of bytes

для получения дополнительной информации см professional linux kernel architecture by wolfgang mauerer

+0

Что я хотел спросить, почему эти функции имеют различные возвращаемые значения, как в один возвращаемый логический адрес и другой указатель возврата на страницу структуры. Почему это так? ugh оба используют один и тот же спутник распределения. –

+0

В ядре есть много мест, где необходимо работать со структурами страниц. Они особенно полезны в любой ситуации, когда вы имеете дело с высокой памятью, которая не имеет постоянного адреса в пространстве ядра. Так что 'alloc_pages() 'используются в этих ситуациях. – EnterKEY

+0

Извините, что снова вас убьют, не могли бы вы рассказать мне, что вы подразумеваете под «постоянным адресом в пространстве ядра». Я понимаю разницу между виртуальным адресом, логическим адресом и физическим адресом и тем, как они связаны. Так вы можете связать с ними постоянный адрес в пространстве ядра. Спасибо заранее. –

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