KMALLOC大小分配

KMALLOC只在页面大小的内存中分配,还是可以less分配? kmalloc可以分配的大小是多less? 我在哪里可以find它的描述,因为我看起来每个人都没有真正说出它分配多less内存? 我想知道的是KMALLOC分配的实际大小是多less。 它是否分配2的幂的大小? 它只是从caching中find准备好的免费对象?

Solutions Collecting From Web of "KMALLOC大小分配"

我的理解如下:内核正在处理系统的物理内存,它只能在页面大小的块中使用; 因此当你调用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 

您可以在系统中看到kmalloc()使用的一些常见大小:

 cat /proc/slabinfo | grep kmalloc 

比考虑kmalloc是否可以分配少于一个页面更重要的是它是否可以分配多于一个页面的问题:如果你在原子上下文中调用kmalloc() (带有GFP_ATOMIC标志),它不能赢得在内存中很难找到连续的页面,所以如果你的内存非常分散,并且你的分配顺序很高(allocation size → pagesize*2^(allocation order)) ,分配可能会失败。 所以,在原子环境下,大的分配可能会失败。

在另一个关于最大AF_UNIX数据报大小的SO问题中 ,有一个命令7(512 Kb)分配失败的例子。

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

 CONFIG_SLAB CONFIG_SLUB CONFIG_SLOB 

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

SLAB分配器支持的最大kmalloc大小为32 MB(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数组,因为可以从同一页面分配不同大小的对象。

 #define KMALLOC_SHIFT_HIGH PAGE_SHIFT #define KMALLOC_SHIFT_MAX 30 

kmalloc()的最大可分配大小是

 #define KMALLOC_MAX_SIZE (1UL << KMALLOC_SHIFT_MAX) 

kmalloc()的最小可分配大小是

 #define KMALLOC_MIN_SIZE (1 << KMALLOC_SHIFT_LOW) 

板坯的默认KMALLOC_SHIFT_LOW是5,竹节和懒人是3。