#include<linux/slab.h>
void*kmalloc(size_tsize,intflags);
voidkfree(void*obj);
内存分配的最常用接口.
#include<linux/mm.h>
GFP_USER
GFP_KERNEL
GFP_NOFS
GFP_NOIO
GFP_ATOMIC
控制内存分配如何进行的标志,从最少限制的到最多的.GFP_USER和GFP_KERNEL优先级
允许当前进程被置为睡眠来满足请求.GFP_NOFS和GFP_NOIO禁止文件系统操作和所有
的I/O操作,分别地,而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_tsize,size_toffset,unsignedlongflags,constructor
(),destructor());
intkmem_cache_destroy(kmem_cache_t*cache);
创建和销毁一个slab缓存.这个缓存可被用来分配几个相同大小的对象.
SLAB_NO_REAP
SLAB_HWCACHE_ALIGN
SLAB_CACHE_DMA
在创建一个缓存时可指定的标志.
SLAB_CTOR_ATOMIC
SLAB_CTOR_CONSTRUCTOR
分配器可用传递给构造函数和析构函数的标志.
void*kmem_cache_alloc(kmem_cache_t*cache,intflags);
voidkmem_cache_free(kmem_cache_t*cache,constvoid*obj);
从缓存中分配和释放一个单个对象./proc/slabinfo一个包含对slab缓存使用情况统计的虚拟
文件.
#include<linux/mempool.h>
mempool_t*mempool_create(intmin_nr,mempool_alloc_t*alloc_fn,mempool_free_t*free_fn,void
*data);
voidmempool_destroy(mempool_t*pool);
创建内存池的函数,它试图避免内存分配设备,通过保持一个已分配项的"紧急列表".
void*mempool_alloc(mempool_t*pool,intgfp_mask);
voidmempool_free(void*element,mempool_t*pool);
从(并且返回它们给)内存池分配项的函数.
unsignedlongget_zeroed_page(intflags);
unsignedlong__get_free_page(intflags);
unsignedlong__get_free_pages(intflags,unsignedlongorder);
面向页的分配函数.get_zeroed_page返回一个单个的,零填充的页.这个调用的所有的其他版
本不初始化返回页的内容.
intget_order(unsignedlongsize);
返回关联在当前平台的大小的分配级别,根据PAGE_SIZE.这个参数必须是2的幂,并且返回
值至少是0.
voidfree_page(unsignedlongaddr);
voidfree_pages(unsignedlongaddr,unsignedlongorder);
释放面向页分配的函数.
structpage*alloc_pages_node(intnid,unsignedintflags,unsignedintorder);
structpage*alloc_pages(unsignedintflags,unsignedintorder);
structpage*alloc_page(unsignedintflags);
Linux内核中最底层页分配器的所有变体.
void__free_page(structpage*page);
void__free_pages(structpage*page,unsignedintorder);
voidfree_hot_page(structpage*page);
使用一个alloc_page形式分配的页的各种释放方法.
#include<linux/vmalloc.h>
void*vmalloc(unsignedlongsize);
voidvfree(void*addr);
#include<asm/io.h>
void*ioremap(unsignedlongoffset,unsignedlongsize);
voidiounmap(void*addr);
分配或释放一个连续虚拟地址空间的函数.iormap存取物理内存通过虚拟地址,而vmalloc分
配空闲页.使用ioreamp映射的区是iounmap释放,而从vmalloc获得的页使用vfree来释放.
#include<linux/percpu.h>
DEFINE_PER_CPU(type,name);
DECLARE_PER_CPU(type,name);
定义和声明每-CPU变量的宏.
per_cpu(variable,intcpu_id)
get_cpu_var(variable)
put_cpu_var(variable)
提供对静态声明的每-CPU变量存取的宏.
void*alloc_percpu(type);
void*__alloc_percpu(size_tsize,size_talign);
voidfree_percpu(void*variable);
进行运行时分配和释放每-CPU变量的函数.
intget_cpu();
voidput_cpu();
per_cpu_ptr(void*variable,intcpu_id)
get_cpu获得对当前处理器的引用(因此,阻止抢占和移动到另一个处理器)并且返回处理器
的ID;put_cpu返回这个引用.为存取一个动态分配的每-CPU变量,用应当被存取版本所在
的CPU的ID来使用per_cpu_ptr.对一个动态的每-CPU变量当前CPU版本的操作,应当用
对get_cpu和put_cpu的调用来包围.
#include<linux/bootmem.h>
void*alloc_bootmem(unsignedlongsize);
void*alloc_bootmem_low(unsignedlongsize);
void*alloc_bootmem_pages(unsignedlongsize);
void*alloc_bootmem_low_pages(unsignedlongsize);
voidfree_bootmem(unsignedlongaddr,unsignedlongsize);
在系统启动时进行分配和释放内存的函数(只能被直接连接到内核中去的驱动使用)