linux驱动37:kmalloc内存分配

kmalloc和malloc类似,可被阻塞,分配的内存保持原有数据,分配的区域在物理内存中也是连续的。

头文件:

<linux/slab.h>

函数原型:

void *kmalloc(size_t size, int flags);

size:分配的块的大小,flags:分配标志

标志:

定义在<linux/gfp.h>

GFP_KERNEL(常用)

最常用的标志,内核内存的通常分配方法,可能引起休眠。允许kmalloc在空闲内存较少时把当前进程转入休眠以等待一个页面,使用GFP_KERNEL分配内存的函数必须是可重入的。

GFP_ATOMIC(常用)

原子性地分配一些空闲内存页,用于在中断处理例程或其它运行于进程上下文外的代码中分配内存,不会休眠。

其它的一些标志:

GFP_USER,用于为用户空间分配内存,可能引起休眠

GFP_HIGHUSER,有高端内存的话就从高端内存分配

GFP_NOIO,禁止任何IO的初始化

GFP_NOFS,不允许执行任何文件系统的调用

下面的标志可以和上面的标志或( | )起来使用,控制如何进行分配:

__GFP_DMA,分配发生在可进行DMA你内存段中

__GFP_HIGHMEM,分配的内存可位于高端内存

__GFP_COLD,内存分配器试图返回处理器缓存中的内存页

__GFP_NOWARN,避免内核在分配内存失败时产生警告

__GFP_HIGH,高优先级请求

__GFP_REPEAT,重新尝试分配

__GFP_NOFALL,始终不返回失败

__GFP_NORETRY,请求内存不成功,立即返回

内存区段:

linux内核把内存分为三个区段:可用于DMA的内存、常规内存和高端内存。通常的内存分配都在常规内存区,通过标志页可以请求在其他区段中分配。

高端内存是32位平台为了访问相对大量的内存而存在的一种机制。

当一个新页面通过kmalloc被分配时,内核会创建一个内存区段的列表以供搜索。如果指定了__GFP_DMA,则只搜索DMA区段;如果没有指定标志,则搜索常规区段和DMA区段;如果指定了__GFP_HIGHMEM,则三个区段都会被搜索。

kmalloc不能分配高端内存。

分配大小size:

内核负责管理系统物理内存,物理内存只能按页面进行分配。linux处理内存分配的方法是,创建一系列的内存对象池,每个池中的内存块大小是固定一致的。处理内存分配请求时,就直接在包含有足够大的池中传递一个整块给请求者。

kmalloc能处理的最新内存块是32或64(取决于当前体系结构使用的页面的大小)。

kmalloc能分配的内存大小,存在一个上限。如果希望代码有很好的移植性,则不应该分配大于128KB的内存。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值