kzalloc() - 一次通话时的最大大小?

时间:2012-08-23 15:02:52

标签: memory-management linux-kernel kernel

我们可以在一次调用中使用kzalloc()分配的最大大小是多少?

这是一个非常常见的问题。如果我能证实这个价值,请告诉我。

3 个答案:

答案 0 :(得分:4)

上限(可在单个kmalloc / kzalloc请求中分配的字节数)是以下函数: 处理器 - 真的,页面大小 - 和 伙伴系统空闲列表的数量(MAX_ORDER)。

在x86和ARM上,标准页面大小为4 Kb,MAX_ORDER为11,单个调用的kmalloc上限为4 MB!

详细信息,包括解释和测试代码,在这里: http://kaiwantech.wordpress.com/2011/08/17/kmalloc-and-vmalloc-linux-kernel-memory-allocation-api-limits/

答案 1 :(得分:2)

与kmalloc()没有什么不同。这是你应该问(或搜索)的问题,因为kzalloc只是一个设置GFP_ZERO的瘦包装。

最多约PAGE_SIZE(至少4k)没问题:p。除此之外......你说很多人都会问你这是对的,这绝对是你必须考虑的事情。显然它取决于内核版本 - 曾经有一个很难的128k限制,但它现在已经增加(或者可能完全丢弃)。这只是硬限制,你实际得到的东西取决于给定的系统。 (并且非常肯定在内核版本上)。

也许阅读What is the difference between vmalloc and kmalloc?

您可以通过检查来自kzalloc()的返回值来“验证”分配,但到那时您可能已经记录了分配失败回溯。除此之外,不 - 我认为没有提前检查的好方法。

答案 2 :(得分:1)

但是,这取决于您的内核版本和配置。这些限制通常位于linux / slab.h中,通常如下所示(此示例在linux 2.6.32下):

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

您可以使用以下代码测试它们:

#include <linux/module.h>
#include <linux/slab.h>
int init_module()
{

    printk(KERN_INFO "KMALLOC_SHILFT_LOW:%d, KMALLOC_SHILFT_HIGH:%d, KMALLOC_MIN_SIZE:%d, KMALLOC_MAX_SIZE:%lu\n",
            KMALLOC_SHIFT_LOW,  KMALLOC_SHIFT_HIGH, KMALLOC_MIN_SIZE, KMALLOC_MAX_SIZE);
    return 0;
}

void cleanup_module()
{
    return;
}

最后,linux 2.6.32 32bits下的结果为:3,22,8,4194304,表示最小大小为8字节,最大大小为4MB。

PS。 你也可以检查kmalloc分配的内存的实际大小,只需使用ksize(),即

void *p = kmalloc(15, GFP_KERNEL);
printk(KERN_INFO "%u\n", ksize(p)); /* this will print "16" under my kernel */