Linux 内核中的kmalloc和slab分配器

在linux内核中我们经常使用kmalloc()进行内存分配,那么kmalloc()是如何分配的呢? 
本文主要对kmalloc()和slab内存分配器进行分析。


废话不多说,直接上code:
devm_kzalloc(&pdev->dev, sizeof(*lpi2c_imx), GFP_KERNEL);
{
#define GFP_KERNEL      (__GFP_RECLAIM | __GFP_IO | __GFP_FS)
#define __GFP_RECLAIM ((__force gfp_t)(___GFP_DIRECT_RECLAIM|___GFP_KSWAPD_RECLAIM))
}


drivers/base/devres.c
devm_kmalloc(dev, size, gfp | __GFP_ZERO);
{
struct devres 
{
        struct devres_node              node;
        unsigned long long              data[]; /* guarantee ull alignment */
};


struct devres *dr;
dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev));
{
size_t tot_size = sizeof(struct devres) + size;

从slab中开始分配内存
dr = kmalloc_node_track_caller(tot_size, gfp, nid);
{
#define kmalloc_node_track_caller(size, flags, node) \
__kmalloc_node_track_caller(size, flags, node, _RET_IP_)

mm/slab.c
__do_kmalloc_node(size, flags, node, caller);
{
struct kmem_cache *cachep;

根据size从kmalloc_caches[N]中获取合适的kmem_cache,kmalloc_caches是在
kmem_cache_init()-> create_kmalloc_caches()的时候进行初始化,code如下:
create_kmalloc_caches(unsigned long flags) mm/slab_common.c
{
for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) 
{
new_kmalloc_cache(i, flags);
{
可知kmalloc_caches[idx]的大小跟kmalloc_info[idx].size相关
kmalloc_info的定义在mm/slab_common.c中,以下为定义的一部分:
{NULL,          0},         {"kmalloc-96",    96},
{"kmalloc-192", 192},         {"kmalloc-8     8},
{"kmalloc-16",  16},         {"kmalloc-32",   32},
{"kmalloc-64",  64},         {"kmalloc-128",  128}
通过对kmalloc_info的分析,可知kmalloc能分配的最大内存为64M,因为
数组中size的最大值为{"kmalloc-67
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值