2012-09-24 55 views
7

KMALLOC是只分配给页面大小的内存,还是可以少分配? kmalloc可以分配的尺寸是多少? 我在哪里可以找到它的描述,就像我看到的每个地方都没有说它分配了多少内存? 我想知道的是KMALLOC分配的实际大小是多少。 它分配2的幂的大小吗? 它只是从缓存中找到准备好的免费对象吗?KMALLOC大小分配

+2

'kmalloc()'的源代码可以给你所有这些信息。至于分配的实际内存量,请参阅[ksize()函数](http://lxr.free-electrons.com/ident?i=ksize)。有时,'kmalloc()'的确在一个适当的缓存中寻找一个空闲的对象,有时候会分配整个页面。是的,'kmalloc'可以分配实际大小小于一页的块。实现随着时间的推移而变化,因此分析“kmalloc()”的源代码比查找任何其他文档更有用。 – Eugene

回答

10

我的理解如下:内核正在处理系统的物理内存,该内存仅在页面大小的块中可用;因此当您拨打kmalloc()时,您将只能获得某些预定义的固定大小的字节数组。

您获得的实际内存取决于系统的体系结构,但kmalloc可以处理的最小分配大小为32或64个字节。你会回电话kmalloc()至少尽可能多的内存,你问(通常更多)。通常你不会得到超过128 KB(再次,依赖于架构)

获得页面大小(以字节为单位)你的系统,你可以执行以下命令:

getconf PAGESIZE 

getconf PAGE_SIZE 

关于最大页面大小的信息在/usr/src/linux/include/linux/slab.h

是的,页面大小通常是2的幂,但是再次,你不会得到究竟你要求什么,但多一点。

您可以使用像这样的代码:

void * stuff; 
stuff = kmalloc(1,GFP_KERNEL); 
printk("I got: %zu bytes of memory\n", ksize(stuff)); 
kfree(stuff); 

要显示的内存分配的实际金额:

[90144.702588] I got: 32 bytes of memory 
2

您可以看到与使用kmalloc() INT您的系统中的一些常见尺寸:

cat /proc/slabinfo | grep kmalloc 

比考虑kmalloc是否可以考虑更重要如果您在原子上下文中调用kmalloc()(使用GFP_ATOMIC标志),则它不能也不会尽力在内存中查找连续的页面,所以如果你的记忆非常分散,并且你的分配顺序很高(allocation size → pagesize*2^(allocation order)),分配可能会失败。所以,在原子上下文中,大的分配可能会失败。

this other SO question about maximum AF_UNIX datagram size有一个订单7(512 Kb)分配失败的例子。

2

这一切都取决于内核中使用的分配器。板坯,竹节或Slob。 请参见下面的内核配置变量:

CONFIG_SLAB 
CONFIG_SLUB 
CONFIG_SLOB 

上述所有分配器使用MAX_ORDERPAGE_SHIFT决定的kmalloc()的最大限制

由SLAB分配器支持的最大kmalloc的大小为32兆字节(2^25)或最大可分配页面顺序(如果小于32 MB)。

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

SLUB直接为请求1页(PAGE_SIZE * 2)分配请求。较大的请求被传递给页面分配器。

#define KMALLOC_SHIFT_HIGH  (PAGE_SHIFT + 1) 
#define KMALLOC_SHIFT_MAX  (MAX_ORDER + PAGE_SHIFT) 

SLOB将大于一页的所有请求传递给页面分配器。由于可以从同一页面分配不同大小的对象,因此不需要kmalloc数组。通过用kmalloc()

#define KMALLOC_SHIFT_HIGH  PAGE_SHIFT 
#define KMALLOC_SHIFT_MAX  30 

最大可分配的大小是从kmalloc的

#define KMALLOC_MAX_SIZE  (1UL << KMALLOC_SHIFT_MAX) 

最小分配大小()是

#define KMALLOC_MIN_SIZE (1 << KMALLOC_SHIFT_LOW) 

默认KMALLOC_SHIFT_LOW板坯是5,而对于竹节和SLOB它是3.