我们可以在一次调用中使用 kzalloc() 分配的最大大小是多少?
这是一个非常常见的问题。另外请让我知道我是否可以验证该值。
我们可以在一次调用中使用 kzalloc() 分配的最大大小是多少?
这是一个非常常见的问题。另外请让我知道我是否可以验证该值。
上限(可以在单个 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/
与 kmalloc() 没有什么不同。这是您应该问(或搜索)的问题,因为 kzalloc 只是一个设置 GFP_ZERO 的薄包装器。
最多大约 PAGE_SIZE(至少 4k)没问题:p。除此之外......你说得对,很多人都问过,这绝对是你必须考虑的事情。显然它取决于内核版本 - 曾经有一个硬性 128k 限制,但现在已经增加(或者可能完全放弃)。不过,这只是硬性限制,您实际可以获得的内容取决于给定的系统。(而且非常肯定在内核版本上)。
您始终可以通过检查 kzalloc() 的返回值来“验证”分配,但到那时您可能已经记录了分配失败的回溯。除此之外,不 - 我认为没有提前检查的好方法。
但是,这取决于您的内核版本和配置。这些限制通常位于 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 */