shd*_*shd 9 c linux memory linux-kernel
KMALLOC仅在页面大小内存中分配,还是可以分配更少?kmalloc可以分配的大小是多少?我在哪里可以找到它的描述,因为我看到它并没有真正说明它分配了多少内存?我想知道的是KMALLOC分配的实际大小是多少.它是否分配2的功率大小?它只是从缓存中找到准备好的自由对象吗?
Mik*_*ike 11
我的理解如下:内核正在处理系统的物理内存,它只在页面大小的块中可用; 因此,当您调用时,您kmalloc()将只获得某些预定义的固定大小的字节数组.
您获得的实际内存取决于系统的体系结构,但kmalloc可以处理的最小分配大小为32或64字节.您将从呼叫中恢复kmalloc() 至少与您要求的内存(通常更多).通常,您将不会超过128 KB(再次,依赖于体系结构)
要获取系统的页面大小(以字节为单位),您可以执行以下命令:
getconf PAGESIZE
Run Code Online (Sandbox Code Playgroud)
要么
getconf PAGE_SIZE
Run Code Online (Sandbox Code Playgroud)
有关最大页面大小的信息位于/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);
Run Code Online (Sandbox Code Playgroud)
显示分配的实际内存量:
[90144.702588] I got: 32 bytes of memory
Run Code Online (Sandbox Code Playgroud)
这完全取决于内核中使用的分配器.平板,竹节或斯洛伐克.请参阅以下内核配置变量:
CONFIG_SLAB
CONFIG_SLUB
CONFIG_SLOB
Run Code Online (Sandbox Code Playgroud)
以上所有分配器都使用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
Run Code Online (Sandbox Code Playgroud)
SLUB直接分配适合订单1页面的请求(PAGE_SIZE*2).较大的请求被传递给页面分配器.
#define KMALLOC_SHIFT_HIGH (PAGE_SHIFT + 1)
#define KMALLOC_SHIFT_MAX (MAX_ORDER + PAGE_SHIFT)
Run Code Online (Sandbox Code Playgroud)
SLOB将大于一页的所有请求传递给页面分配器.不需要kmalloc数组,因为可以从同一页面分配不同大小的对象.
#define KMALLOC_SHIFT_HIGH PAGE_SHIFT
#define KMALLOC_SHIFT_MAX 30
Run Code Online (Sandbox Code Playgroud)
kmalloc()的最大可分配大小是
#define KMALLOC_MAX_SIZE (1UL << KMALLOC_SHIFT_MAX)
Run Code Online (Sandbox Code Playgroud)
来自kmalloc()的最小可分配大小是
#define KMALLOC_MIN_SIZE (1 << KMALLOC_SHIFT_LOW)
Run Code Online (Sandbox Code Playgroud)
KMALLOC_SHIFT_LOWslab的默认值是5,而slub和slob的默认值是3.
| 归档时间: |
|
| 查看次数: |
26347 次 |
| 最近记录: |