KMALLOC是只分配给页面大小的内存,还是可以少分配? kmalloc可以分配的尺寸是多少? 我在哪里可以找到它的描述,就像我看到的每个地方都没有说它分配了多少内存? 我想知道的是KMALLOC分配的实际大小是多少。 它分配2的幂的大小吗? 它只是从缓存中找到准备好的免费对象吗?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()
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)分配失败的例子。
这一切都取决于内核中使用的分配器。板坯,竹节或Slob。 请参见下面的内核配置变量:
CONFIG_SLAB
CONFIG_SLUB
CONFIG_SLOB
上述所有分配器使用MAX_ORDER和PAGE_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.
- 1. 可以用kmalloc()分配的最大大小取决于free_area []的大小吗?
- 2. kmalloc:只分配4个字节
- 3. Ntcreatefile分配大小
- 4. kmalloc许多结构,我应该一次kmalloc全部或分别
- 5. 分配可变大小类
- 6. SetIntersection大小,而不分配
- 7. 分配大小无效? C++
- 8. 索引分配最大文件大小
- 9. 最大的矢量大小分配C++
- 10. 最大内存映射分配大小?
- 11. kmalloc如何返回大于物理地址大小的物理地址?
- 12. 根据文件大小动态分配大小为阵列 - C
- 13. 如何将矢量大小分配给数组大小C++?
- 14. java.lang.OutOfMemoryError :(堆大小= 17863KB,分配的= 11272KB,位图大小= 12444KB)
- 15. SQL Server:区分大小写的匹配?
- 16. 删除图像大小分配 - wordpress
- 17. 动态分配的变量大小
- 18. 分配给RIR的IPv4池大小
- 19. 由malloc分配的指针大小
- 20. SQLite - 预分配数据库大小
- 21. 如何配置AutoMapper区分大小写?
- 22. 在堆上分配的内存大小
- 23. 区分大小写的匹配
- 24. 用nullptr和零大小分配
- 25. 不区分大小写的匹配
- 26. 使用类 - 无效的分配大小
- 27. 有限的分配大小C++
- 28. 在C#中分配堆栈大小?
- 29. 不区分大小写的Rspec匹配
- 30. 类型和内存分配的大小
'kmalloc()'的源代码可以给你所有这些信息。至于分配的实际内存量,请参阅[ksize()函数](http://lxr.free-electrons.com/ident?i=ksize)。有时,'kmalloc()'的确在一个适当的缓存中寻找一个空闲的对象,有时候会分配整个页面。是的,'kmalloc'可以分配实际大小小于一页的块。实现随着时间的推移而变化,因此分析“kmalloc()”的源代码比查找任何其他文档更有用。 – Eugene