Краткая справка |
Предыдущая Содержание Следующая |
Функциями и символами, связанными с выделением памяти, являются:
#include <linux/slab.h> void *kmalloc(size_t size, int flags); void kfree(void *obj); Наиболее часто используемый интерфейс для выделения памяти.
#include <linux/mm.h> 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 <linux/malloc.h> 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 <linux/mempool.h> 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 <linux/vmalloc.h> void * vmalloc(unsigned long size); void vfree(void * addr);
#include <asm/io.h> void * ioremap(unsigned long offset, unsigned long size); void iounmap(void *addr); Функции, которые выделяют или освобождают непрерывное виртуальное адресное пространство. ioremap адресует физическую память с помощью виртуальных адресов, а vmalloc выделяет свободные страницы. Области, связанные с ioremap, освобождаются iounmap, а страницы, полученные vmalloc, освобождаются vfree.
#include <linux/percpu.h> 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 <linux/bootmem.h> 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); Функции (которые могут быть использованы только драйверами непосредственно встроенными в ядро), которые осуществляют выделение и освобождение памяти во время начальной загрузки системы.
|
Предыдущая Содержание Следующая |