LDD3读书笔记(第5章 内存分配)

#include <linux/slab.h>
void *kmalloc(size_t size, int flags);
内存分配函数

后备高速缓存
#include <linux/slab.h>
kmem_cache_t *kmem_cache_create(const char *name,size_t size,size_t offset,unsigned long flags,
                                void (*constructor)(void *,kmem_cache_t *,unsigned long flags),
                                void (*destructor)(void *,kmem_cache_t *,unsigned long flags));
int kmem_cache_destroy(kmem_cache_t *cache);
Linux内存高速缓存管理有时候称为“slab分配器”
一旦某个对象的高速缓存被创建,就可以调用kmem_cache_alloc/kmem_cache_free从中分配/释放内存对象:
void *kmem_cache_alloc(kmem_cache_t *cache,int flags);
void kmem_cache_free(kmem_cache_t *cache,const void *obj);
高速缓存的使用统计情况可以从/proc/slabinfo获得.

内存区段
mm/page_alloc.c,内存区段初始化mm/init.c
可用于DMA的内存、常规内存、高端内存。通常的内存分配都发生在常规内存区。

内存池
某种形式的后备高速缓存,它试图始终保存空闲的内存,以便在紧急情况下使用.
#include <linux/mempool.h>
mempool_t *mempool_create(int min_nr,mempool_alloc_t *alloc_fn,
                          mempool_free_t *free_fn,void *pool_data);
void mempool_destroy(mempool_t *pool);
创建内存池对象
typedef void *(mempool_alloc_t)(int gfp_mask,void *pool_data);
typedef void (mempool_free_t)(void *element,void *pool_data);
int mempool_resize(mempool_t *pool,int new_min_nr,int gfp_mask);
调整mempool大小

get_zeroed_page(unsigned int flags);
  返回指向新页面的指针并将页面清零
__get_free_page(unsigned int flags);
  类似于get_zeroed_page,但不清零页面
__get_free_page(unsigned int flags,unsigned int order);
  分配若干(屋里连续)页面,并返回指向该内存区域第一个字节的指针,但不清零页面
/proc/buddyinfo可告诉你系统中每个内存区段上每个阶数下可获得的数据块数目.
void free_page(unsigned long addr);
void free_pages(unsigned long addr,unsigned long order);
内存区段的分配和释放

alloc_pages接口
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);
分配内存页
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);
释放内存页

虚拟地址空间
#include <linux/vmalloc.h>
void *vmalloc(unsigned long size);
void vfree(void *addr);
void *ioremap(unsigned long offset,unsigned long size);
void iounmap(void *addr);

per-CPU变量
#include <linux/percpu.h>
静态分配
DEFINE_PER_CPU(type,name);
DEFINE_PER_CPU(int[3],my_percpu_array);
get_cpu_var(sockets_in_use)++;
put_cpu_var(sockets_in_use);
per_cpu(variable,int cpu_id);
动态分配
void *alloc_percpu(type);
void *__alloc_percpu(size_t size,size_t align);
per_cpu_ptr(void *per_cpu_var,int cpu_id);
EXPORT_PER_CPU_SYMBOL(per_cpu_var);
EXPORT_PER_CPU_SYMBOL_GPL(per_cpu_var);
DECLARE_PER_CPU(type,name);
通过调用下列函数之一则可完成引导时的内存分配:
#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);


 

你可能感兴趣的:(LDD3读书笔记(第5章 内存分配))