Призраки ядра или модули-невидимки




Рисунок 8 on-line man по функциям выделения ядерной памяти


В первую очередь хотелось бы отметить функцию "void *kmalloc(size_t size, int priority)", где size – размер запрашиваемого блока, который должен быть одним из следующих значений (в байтах): 24, 56, 120, 244, 500, 1012, 2032, 4072, 8168, 16360, 32744, 65512 или 131048. В противном случае функция автоматически округлит размер блока в большую сторону.

Параметр priority

задает стратегию выделения памяти. GFP_ATOMIC выделяет требуемую память немедленно (при необходимости вытесняя другие страницы на диск), GFP_KERNEL резервирует блок памяти, выделяя страницы памяти по мере обращения к ним, GFP_BUFFER никогда не вытесняет другие страницы и если запрошенная память недоступна с выделением наступает облом. Существуют и другие стратегии выделения, но нам они не интересны, поскольку фактически приходится выбирать между GFP_ATOMIC и GFP_KERNEL. Обычно используют последний, т. к. он ведет себя не столь агрессивно.

Если нужно выделить всего одну страницу памяти, имеет смыл воспользоваться функцией "unsigned long __get_free_page(int priority)", где priority тот же самый, что и у kmalloc. Ее ближайшая родственница: "get_free_page(int priority)" отличается только тем, что обнуляет память сразу же после выделения, что несколько снижает производительность и к тому же мы все равно будем копировать резидентный код через memcpy, так что содержимое страницы нам не критично.

Определения всех функций (с краткими комментариями) содержатся во включаемом файле <linux/mm.h>.




Содержание  Назад  Вперед