linux内存分配方法总结

发表于:2013-5-20 10:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

分享:

  b.slab高速缓存(反复分配很多同一大小内存)   注:使用较少

  kmem_cache_t* xx_cache;

  创建: xx_cache = kmem_cache_create(“name”, sizeof(struct xx), SLAB_HWCACHE_ALIGN, NULL, NULL);

  分配: kmem_cache_alloc(xx_cache, GFP_KERNEL);

  释放: kmem_cache_free(xx_cache, addr);

  内存池

  mempool 不使用。

  c.kmalloc(最常用的分配接口)         注:必须小于128KB

  GFP_ATOMIC 不休眠,用于中断处理等情况

  GFP_KERNEL 会休眠,一般状况使用此标记

  GFP_USER   会休眠

  __GFP_DMA  分配DMA内存

  kmalloc/kfree

  d.vmalloc/vfree

  vmalloc采用高端内存预留的虚拟空间来收集内存碎片引起的不连续的物理内存页,是用于非连续物理内存分配。

  当kmalloc分配不到内存且无物理内存连续的需求时,可以使用。(优先从高端内存中查找)

  e.ioremap()/iounmap()

  ioremap()的作用是把device寄存器和内存的物理地址区域映射到内核虚拟区域,返回值为内核的虚拟地址。使用的线性地址区间也在vmmlloc段

  注:

  vmalloc()与 alloc_pages(_GFP_HIGHMEM)+kmap();前者不连续,后者只能映射一个高端内存页面

  __get_free_pages与alloc_pages(NORMAL)+page_address(); 两者完全等同

  内核地址通过 __va/__pa进行中低内存的直接映射

  高端内存采用kmap/kmap_atomic的方式来映射

  个人总结如下:

  a.在<128kB的一般内存分配时,使用kmalloc

  允许睡眠:GFP_KERNEL

  不允许睡眠:GFP_ATOMIC

  b.在>128kB的内存分配时,使用get_free_pages,获取成片页面,直接返回虚拟地址(<4M)(或alloc_pages + page_address)

  c.b失败,

  如果要求分配高端内存:alloc_pages(_GFP_HIGHMEM)+kmap(仅能映射一个页面)

  如果不要求内存连续: 则使用vmalloc进行分配逻辑连续的大块页面.(不建议)/分配速度较慢,访问速率较慢。

  d.频繁创建和销毁很多较大数据结构,使用slab.

  e.高端内存映射:

  允许睡眠:kmap              (永久映射)

  不允许睡眠:kmap_atomic      (临时映射)会覆盖以前到映射(不建议)

22/2<12
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号