内核模块作者的内核内存分配 - 第1部分
1. 不同场景下的内存分配
在了解了算法的基础知识后,我们来考虑几种内存分配的场景,包括简单场景和复杂场景。
- 最简单的情况 :内核空间的设备驱动程序(或某些核心代码)请求128 KB的内存,从空闲列表数据结构的5阶列表中获得一个内存块。之后,它会使用页面分配器的释放API释放该内存块。该API通过计算阶数,将释放的块放入5阶列表中。
- 更复杂的情况 :当设备驱动请求128 KB内存时,5阶列表为空。根据页面分配器算法,会检查6阶列表。若6阶列表非空,算法会从该列表中取出一个256 KB的块并将其分成两半。一半(128 KB)给请求者,另一半(128 KB)放入5阶列表。当请求者释放内存块时,算法会先计算其应放入5阶列表,但在放入之前,会查找其伙伴块。若找到伙伴块,会将两者合并成一个256 KB的块,并放入6阶列表,这有助于内存碎片整理。
- 不利的情况 :当设备驱动请求132 KB的内存块时,由于不能分配小于请求的内存,页面分配器会分配下一个可用的内存块,即7阶的256 KB内存块。但驱动程序只会使用前132 KB,剩余的124 KB被浪费,这就是内部碎片问题,是二进制伙伴系统的关键缺陷。不过,有一个补丁(通过 alloc_pages_exact() / free_pages_exact() API)可以缓解这个问题。
2. 页面分配器内部细节
在数据结构方面, zone 结构包含一个
超级会员免费看
订阅专栏 解锁全文

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



