如何在内核中断上下文中分配内存

判断一个内存分配函数能否用在中断上下文中,主要看这个内存函数最终调用的伙伴系统算法的函数接口page_alloc(gfp_mask,order)的gfp_mask的内容,用在中断上下文中一般是GFP_ATOMIC,否则通常GFP_KERNEL作为内存分配标志。
get_free_pages()也是根据传递的参数gfp_mask,决定这个分配函数是否能睡眠,所以传递的gfp_mask参数决定了是否能用在中断上下文中。

内核中函数分配根据分类方式的不同:
1 根据分配时是否睡眠分为两类:
使用GFP_ATOMIC标志分配内存,告诉分配函数不能睡眠,一般仅仅在中断上下文,或者持有锁的代码中使用。
使用GFP_KERNEL标志分配内存,在分配过程中,可能会阻塞,一般用在进程上下文。
对于常规内存的分配,是用get_free_pages(),是用这个标志作为分配的参数时,可以使用在中断上下文,或者持有锁的代码段中。
对于高端物理内存使用alloc_pages()(用在中断上下文中应该传递GFP_ATOMIC标志)配合持久映射函数kmap()或者临时映射函数kmap_atomic(),其中kmap()用在进程上下文中,而kmap_atomic()用在中断上下文中。

2 根据分配的物理内存的位置可以分为高端物理内存(high zone)和非高端物理内存的分配(dma zone or normal zone)。都有可以睡眠的分配方式和不可睡眠的内存分配方式
上面两种非配方式是交叉,睡眠(或者不可睡眠)的内存分配方式都可以在高端和低端分配

GFP_KERNEL标志的作用:
不管是连续的还是非连续的,可睡眠的还是不可睡眠的分配方式,最终都要使用伙伴系统算法的接口函数,核心就是alloc_pages(),前面提到的GFP_KERNEL以及其他的内存标志最终都会传递给这个函数。所以看一个内存分配函数是否可以用在中断上下文中,只要看这个函数最终使用的伙伴系统的接口函数的flag参数。
看vmalloc()代码就知道,这个函数分配物理内存分配函数page_alloc()传递的参数是GFP_KERNEL|GFP_HIGHMEM,所以自然不能用在中断上下文中。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值