深入解析内核内存分配:从原理到实践
1. 内核内存分配的基本现象与问题
在 x86_64 的 Ubuntu 系统中,使用 kzalloc() 分配内存时,可能会出现实际分配内存大于请求内存的情况。例如,尝试用 kzalloc() 分配 20 字节,实际却获得了 32 字节,浪费了 12 字节,浪费率达 60%。这是因为在 x86 系统中, kmalloc 的 slab 缓存有 16 字节和 32 字节等不同规格,当请求的内存大小介于两者之间时,会分配较大规格的内存。而在基于 ARM 的树莓派系统中, kmalloc 最小的 slab 缓存是 64 字节,请求 20 字节会得到 64 字节。
需要注意的是, ksize() API 仅适用于已分配的 slab 内存,不能用于页分配器 API 的返回值。
2. 测试 slab 分配与 ksize() 的使用
为了进一步探究内存分配情况,我们将之前的内核模块 ch8/slab3_maxsize 扩展为 ch8/slab4_actualsize 。在这个新模块中,会进行循环操作,使用 kmalloc() 分配内存并释放,同时通过调用 ksize() API 记录每次循环中 slab 层实际分配的内存量。以下是相关代码:
// ch8/slab4_ac
超级会员免费看
订阅专栏 解锁全文

3212

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



