38、深入解析内核内存分配:从原理到实践

深入解析内核内存分配:从原理到实践

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值