2

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

这是一个非常常见的问题。另外请让我知道我是否可以验证该值。

4

3 回答 3

5

上限(可以在单个 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/

于 2012-08-24T01:29:19.370 回答
3

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

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

也许阅读vmalloc和kmalloc有什么区别?

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

于 2012-08-23T15:35:19.933 回答
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 */
于 2014-11-07T09:31:25.220 回答