内核怎么分配一段连续的内存区间

内核可以用kmalloc分配一段连续的内存空间,kmalloc的具体实现为:

static __always_inline void *kmalloc(size_t size, gfp_t flags)
{
    struct kmem_cache *cachep;
    void *ret;

    if (__builtin_constant_p(size)) {
        int i;

        if (!size)
            return ZERO_SIZE_PTR;

        if (WARN_ON_ONCE(size > KMALLOC_MAX_SIZE))
            return NULL;

        i = kmalloc_index(size);

#ifdef CONFIG_ZONE_DMA
        if (flags & GFP_DMA)
            cachep = kmalloc_dma_caches[i];
        else
#endif
            cachep = kmalloc_caches[i];

        ret = kmem_cache_alloc_trace(cachep, flags, size);

        return ret;
    }   
    return __kmalloc(size, flags);
}

从上面代码可以发现,kmalloc后面跟了两个形参,第一个是预分配的内存空间大小,第二个是分配标志,可以控制kmalloc的行为(能否睡眠等)。

kmalloc分配的内存属于xkphys地址空间,其特点是虚实地址映射方法为直接映射,不用进行页表转换。而且该段内存是连续的,可以进行随机访问。

 

kmalloc分配内存大小限制:

观察kmalloc的函数实现会发现,分配内存大小不能超过KMALLOC_MAX_SIZE,在启用slab情况下相关代码:


#define KMALLOC_SHIFT_HIGH  ((MAX_ORDER + PAGE_SHIFT - 1) <= 25 ? \
                (MAX_ORDER + PAGE_SHIFT - 1) : 25)

#define KMALLOC_SHIFT_MAX   KMALLOC_SHIFT_HIGH

#define KMALLOC_MAX_SIZE    (1UL << KMALLOC_SHIFT_MAX)

MAX_ORDER和PAGE_SHIFT在不同的情况下值不一样,建议大家自己去看内核源码计算即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值