免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 906 | 回复: 0
打印 上一主题 下一主题

linux内核内存分配 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-29 17:07 |只看该作者 |倒序浏览
内核内存空间动态申请
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP