Linux内核内存分配:深入探究与实践
1. 内存分配的实际情况
在x86_64的Ubuntu系统中,使用 kzalloc() 尝试分配20字节的内存,实际却获得了32字节,造成了12字节(60%)的浪费。这是因为在x86系统中, kmalloc 的slab缓存有16字节和32字节等不同规格,当请求的内存大小介于两者之间时,会分配较大规格的内存。在ARM架构的树莓派系统中, kmalloc 最小的slab缓存是64字节,所以请求20字节时会得到64字节。
需要注意的是, ksize() API仅适用于已分配的slab内存,不能用于页分配器API的返回值。
2. 使用 ksize() 测试slab分配
我们将之前的内核模块 ch8/slab3_maxsize 扩展为 ch8/slab4_actualsize 。在这个新模块中,我们使用 kmalloc() 进行内存分配和释放的循环操作,同时通过调用 ksize() API记录每次循环中slab层实际分配的内存量。
以下是相关代码:
// ch8/slab4_actualsize/slab4_actualsize.c
static int test_maxallocsz(void)
{
size_t size2alloc = 100, actual
超级会员免费看
订阅专栏 解锁全文

54

被折叠的 条评论
为什么被折叠?



