Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра Linux
Назад Внутренние механизмы ядра Вперед

Страничное выделение

Когда нужны блоки больше одной машинной страницы и кратные целому числустраниц:

	#include <linux/gfp.h>
	struct_page * alloc_pages( gfp_t gfp_mask, unsigned int order ) 

- выделяет 2**order смежных страниц (непрерывный участок) физической памяти. Полученный физический адрес требуется конвертировать в логический для использования:

	void *page_address( struct_page * page ) 

Если не требуется физический адрес, то сразу получить логический позволяют:

unsigned long __get_free_page( gfp_t gfp_mask ); - выделяет одну страницу;

unsigned long get_zeroed_page( gfp_t gfp_mask ); - выделяет одну страницу и заполняет её нулями;

unsigned long __get_free_pages( gfp_t gfp_mask, unsigned int order ); - выделяет несколько (2**order) последовательных страниц непрерывной областью;

Принципиальное отличие выделенного таким способом участка памяти от выделенного kmalloc() (при равных размерах запрошенных участков для сравнения) состоит в том, что участок, выделенный механизмом страничного выделения и будет всегда выровнен на границу страницы.

В любом случае, выделенную страничную область после использования необходимо возвратить по логическому или физическому адресу (способом в точности симметричным тому, которым выделялся участок!):

	void __free_pages( unsigned long addr, unsigned long order );
	void free_page( unsigned long addr );
	void free_pages( unsigned long addr, unsigned long order );

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


Предыдущий раздел: Оглавление Следующий раздел:
Слабовый распределитель   Выделение больших буферов