内核模块作者的内核内存分配 - 上半部分
1. 内核内存分配基础
在用户空间进行内存操作时需谨慎,而内核的 kfree_sensitive() API 通常能正常工作。在设计内核空间的数据结构时,强烈建议使用 slab API 进行内存分配,因为它能保证分配的内存不仅物理上连续,还与硬件缓存行对齐,这对性能提升很有帮助。以下是一些数据结构设计的小技巧:
- 重要成员集中放置 :将最重要(频繁访问,即“热点”)的成员放在结构体的顶部并集中在一起。例如,若结构体中有五个重要成员,总大小为 56 字节,将它们放在结构体顶部。当 CPU 缓存行大小为 64 字节时,访问其中任何一个重要成员,这五个成员都会被一起加载到 CPU 缓存中,因为 CPU 的内存读写是以缓存行大小为原子单位的,这样能优化性能,毕竟缓存内存的操作速度通常比 RAM 快很多倍。
- 成员对齐 :尽量使结构体成员对齐,避免单个成员跨越缓存行。通常编译器会在这方面提供帮助,也可以使用编译器属性来明确指定。
此外,早期内核中误将该 API 命名为 kzfree() ,从 5.9 版本开始,已更名为 kfree_sensitive() ,相关原因可查看 此提交 。
在覆盖“敏感信息”时,简单的 memset() 可能无法
超级会员免费看
订阅专栏 解锁全文
3011

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



