Краткая справка

Предыдущая  Содержание  Следующая V*D*V

Функциями и символами, связанными с выделением памяти, являются:

 

#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);

Функции (которые могут быть использованы только драйверами непосредственно встроенными в ядро), которые осуществляют выделение и освобождение памяти во время начальной загрузки системы.

 

Предыдущая  Содержание  Следующая