Linux下的内存分配方式简述

1.Buddy System

内存的最小单位为页(4KB),在此基础上使用“伙伴系统算法”协助管理不同连续长度的内存段,将1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块分类管理。

2.slab

在伙伴系统上还有slab协助内存管理,其原理大致为,先统一获取大内存段并且切割分配,当用户需要特定大小内存的时候,从其中取出初始化好的内存返回。

3.各种api函数:

3.1 alloc_pages, 是最原始的内存分配方式,直接从伙伴系统中获取原始页框,通过FORCE_MAX_ZONEORDER对最大获取页数进行限制,一般最大为10,即返回的内存最大为4M。
3.2__get_free_pages,仅是对alloc_pages进行封装,因此最大限制也是4M。
3.3 dma_alloc_coherent 也是通过alloc_pages实现,因此最大限制为4M。
3.4 kmem_cache_alloc ,是基于slab的一种分配方式,适用于反复分配释放同一大小内存块的场合,先通过kmem_cache_create创建一个高速缓存区域,然后用kmem_cache_alloc从 该高速缓存区域中获取新的内存块,kmem_cache_alloc一次能分配的最大内存由mm/slab.c文件中的MAX_OBJ_ORDER宏 定义,在默认的2.6.18内核版本中,该宏定义为5, 于是一次最多能申请1<<5 * 4KB也就是128KB的连续物理内存。
3.5 kmalloc,通过kmem_cache_alloc实现,因此最大只能申请128KB。
3.6 vmalloc前面的内存分配方式都是物理连续,vmalloc没有大小限制,但是仅逻辑地址连续。

这里写图片描述

4.内存分配中的flags:

GFP_KERNEL表示内存分配(最终总是调用get_free_pages来实现实际的分配;这就是GFP前缀的由来)是代表运行在内核空间的进程执行的。使用GFP_KERNEL容许kmalloc在分配空闲内存时候如果内存不足容许把当前进程睡眠以等待。因此这时分配函数必须是可重入的。如果在进程上下文之外如:中断处理程序、tasklet以及内核定时器中这种情况下current进程不该睡眠,驱动程序该使用GFP_ATOMIC.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值