Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра 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 );
При попытке освободить другое число страниц чем то, что выделялось, карта памяти становится повреждённой и система позднее будет разрушена.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Слабовый распределитель | Выделение больших буферов |