- 论坛徽章:
- 0
|
内核内存空间动态申请
kmalloc __get_free_pages 系列申请的内存位于物理内存映射去,与真实的物理地址只有固定偏移
vmalloc()在虚拟内存空间给出连续的内存区,不一定物理连续
void *kmalloc(size_t size, int flags)
flags GFP_KERNEL 若暂时不能满足则进程会睡眠等待
在中断处理,tasklet 内核定时器等非进程上下文环境中不能阻塞应使用GFP_ATOMIC
GFP_USER(为用户空间页分配内存,可阻塞) GFP_HIGHMEM
GFP_NOIO不允许任何初始化GFP_NOFS不允许任何文件系统调用
__GFP_DMA要求分配在DMA内存区
__GFP_HIGHMEM分配的内存位于可以高端内存
__GFP_COLD请求一个较长时间不访问的页
__GFP_NOWARN阻止警告
__GFP_REPREAT重复尝试
__GFP_NOFAIL只允许成功,不推荐
__GFP_NORETRY失败即返回
kfree()
-------------
__get_zeroed_pages(unsigned int flags); 返回指向新页的指针
__get_free_page(unsigned int flags);==__get_free_pages(flags,0)
__get_free_page(unsigned int flags,unsigned int order) order
上述函数调用alloc_pages()
struct page *alloc(int gfp_mask, unsigned long order); flag标志同kmalloc
-----------------
vmalloc用于申请大量内存(需要建立新的页表),内部实现使用GFP_KERNEL的kmalloc,
不能用于原子上下文。
void * vmalloc(unsigned int long size)
void free(void *addr)
获取创建模块的空间
===================================================================
创建slab缓存,可以驻留任意数目全同样大小的后备缓存
struct kmem_cache * kmem_cache_create(
const char*name,size_t size,size_t align,unsigned long flags,
void (*ctor)(void *,struct kmem)cache *, unsigned long),
void (*dtor)(void *,struct kmem)cache *, unsigned long));
flag SLAB_NO_REAP(不自动收缩) SLAB_HWCACHE_ALIGN每个数据对象对齐到缓存行)
SLAB_CACHE_DMA
分配SLAB
void *kmalloc_cache_alloc(struct kmem_cache *cachep,gfp_t flags);
void *kmalloc_free(struct kmem_cache *cachep,void *objp);
int kmem_cache_destroy(struct kmem_cache *cachep);
====================================================================
内存池 分配大量小对象
mempool_t mempool_create(int min_nr, mem_pool_alloc_t *alloc_fn,
mempool_free_t *free_fn, void *pool_data);
typedef void * (mempool_alloc_t)(int gfp_mask,void *pool_data);
typedef void (mempool_free_t)(void *element, void *pool_data);
只有__GFP_WAIT才休眠
void *mempool_alloc(mempool_t *pool, int gfp_mask);
void *mempool_free(void *element, mempool_t *pool);
void mempool_destroy(mempool_t *pool);
=============================================
virt_to_phys() phys_to_virt() PAGE_OFFSET
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/69624/showart_1019491.html |
|