`
mmdev
  • 浏览: 12934907 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

LDD3学习笔记(11):内存分配

 
阅读更多
Kmalloc分配内存快并且不清零获得的内存区,内存区保留它原来的内容,分配的区在物理内存中连续。

#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_USERGFP_KERNEL优先级

允许当前进程被置为睡眠来满足请求.GFP_NOFSGFP_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变量,用应当被存取版本所在

CPUID来使用per_cpu_ptr.对一个动态的每-CPU变量当前CPU版本的操作,应当用

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

在系统启动时进行分配和释放内存的函数(只能被直接连接到内核中去的驱动使用)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics