Краткая справка
Функциями и символами, связанными с выделением памяти, являются:
#include
void *kmalloc(size_t size, int flags);
void kfree(void *obj);
Наиболее часто используемый интерфейс для выделения памяти.
#include
GFP_USER
GFP_KERNEL
GFP_NOFS
GFP_NOIO
GFP_ATOMIC
Флаги, которые контролируют, как выполняется распределение памяти, начиная с наименее для всего ограничительного. GFP_USER и GFP_KERNEL, по порядку, позволяют текущему процессу быть помещённым в сон для удовлетворения запроса. GFP_NOFS и GFP_NOIO запрещают операции с файловой системой и все операции ввода/вывода соответственно, а выделение памяти с GFP_ATOMIC совсем не может спать.
__GFP_DMA
__GFP_HIGHMEM
__GFP_COLD
__GFP_NOWARN
__GFP_HIGH
__GFP_REPEAT
__GFP_NOFAIL
__GFP_NORETRY
Эти флаги изменяют поведение ядра при выделении памяти.
#include
kmem_cache_t *kmem_cache_create(char *name, size_t size, size_t offset,
unsigned long flags, constructor( ), destructor( ));
int kmem_cache_destroy(kmem_cache_t *cache);
Создают и уничтожают кусковый кэш. Кэш может быть использован для выделения нескольких объектов одинакового размера.
SLAB_NO_REAP
SLAB_HWCACHE_ALIGN
SLAB_CACHE_DMA
Флаги, которые могут быть указаны при создании кэша.
SLAB_CTOR_ATOMIC
SLAB_CTOR_CONSTRUCTOR
Флаги, которые распределитель может передать в функции конструктора и деструктора.
void *kmem_cache_alloc(kmem_cache_t *cache, int flags);
void kmem_cache_free(kmem_cache_t *cache, const void *obj);
Выделяет и освобождает память для одного объекта из кэша.
/proc/slabinfo
Виртуальный файл, содержащий статистические данные об использовании кускового кэша.
#include
mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *data);
void mempool_destroy(mempool_t *pool);
Функции для создания пулов памяти, которые пытаются избежать неудач при выделении памяти, сохраняя "чрезвычайный список" выделенных объектов.
void *mempool_alloc(mempool_t *pool, int gfp_mask);
void mempool_free(void *element, mempool_t *pool);
Функции для выделения объектов из (и их возвращения в) пулов памяти.
unsigned long get_zeroed_page(int flags);
unsigned long __get_free_page(int flags);
unsigned long __get_free_pages(int flags, unsigned long order);
Странично-ориентированные функции выделения памяти. get_zeroed_page возвращает единственную, обнулённую страницу. Все другие варианты вызова не инициализируют содержимое возвращаемой страниц(ы).
int get_order(unsigned long size);
Возвращает порядок (order) выделения, связанный с размером в текущей платформы в соответствии с PAGE_SIZE. Аргумент должен быть степенью двойки и возвращаемое значение по крайней мере 0.
void free_page(unsigned long addr);
void free_pages(unsigned long addr, unsigned long order);
Функции, которые используются для освобождения памяти при странично-ориентированный выделениях.
struct page *alloc_pages_node(int nid, unsigned int flags, unsigned int order);
struct page *alloc_pages(unsigned int flags, unsigned int order);
struct page *alloc_page(unsigned int flags);
Все варианты самого низкоуровнего распределителя страниц в ядре Linux.
void __free_page(struct page *page);
void __free_pages(struct page *page, unsigned int order);
void free_hot_page(struct page *page);
void free_cold_page(struct page *page);
Различные способы освобождения страниц, выделенных одной из форм alloc_page.
#include
void * vmalloc(unsigned long size);
void vfree(void * addr);
#include
void * ioremap(unsigned long offset, unsigned long size);
void iounmap(void *addr);
Функции, которые выделяют или освобождают непрерывное виртуальное адресное пространство. ioremap адресует физическую память с помощью виртуальных адресов, а vmalloc выделяет свободные страницы. Области, связанные с ioremap, освобождаются iounmap, а страницы, полученные vmalloc, освобождаются vfree.
#include
DEFINE_PER_CPU(type, name);
DECLARE_PER_CPU(type, name);
Макросы, которые определяют и декларируют по-процессорные переменные.
per_cpu(variable, int cpu_id)
get_cpu_var(variable)
put_cpu_var(variable)
Макросы, которые обеспечивают доступ к статически объявленным по-процессорным переменным.
void *alloc_percpu(type);
void *__alloc_percpu(size_t size, size_t align);
void free_percpu(void *variable);
Функции, которые выполняют выделение и освобождение во время работы с по-процессорными переменными.
int get_cpu( );
void put_cpu( );
per_cpu_ptr(void *variable, int cpu_id)
get_cpu получает ссылку (на переменную) для текущего процессора (следовательно, предотвращает вытеснение и переход к другому процессору) и возвращает идентификатор процессора; put_cpu возвращает эту ссылку (то есть переменную в процессор). Чтобы получить доступ к динамически выделенной по-процессорной переменной, используйте per_cpu_ptr с идентификатором процессора, версия (переменной) которого должна быть доступна. Манипуляции текущей версией по-процессорной переменной должны, вероятно, быть окружены вызовами get_cpu и put_cpu.
#include
void *alloc_bootmem(unsigned long size);
void *alloc_bootmem_low(unsigned long size);
void *alloc_bootmem_pages(unsigned long size);
void *alloc_bootmem_low_pages(unsigned long size);
void free_bootmem(unsigned long addr, unsigned long size);
Функции (которые могут быть использованы только драйверами непосредственно встроенными в ядро), которые осуществляют выделение и освобождение памяти во время начальной загрузки системы.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.