主要观点:作者介绍了自己在 FreeBSD 中对内存分配器的改进工作,从最初对 Chris Kingsley 实现的不满,到逐步优化形成“phkmalloc”,经历了诸多问题与解决方法,包括消除死亡抖动、处理内存释放相关问题等,该内存分配器在性能提升方面得到很多反馈,但也带来了一些麻烦,如导致系统错误等,后来 Jason Evans 接手了“phkmalloc”的维护工作,作者将其视为自己对改善网络安全的重要贡献。
关键信息:
- 1994 - 1995 年 RAM 价格上涨,作者因机器内存小且经常运行 GCC 而关注内存使用效率。
- K&R 的 malloc 在交换系统上编写,而当时已拥有虚拟内存,Chris Kingsley 的 malloc 虽考虑了交换/分页问题,但性能仍不佳且有死亡抖动现象。
- 作者通过修改 malloc 记录调用信息等方式找出问题,提出一系列优化方法,如从 free 链表头部切出小结构等。
- 作者收集大量数据并绘制图表,最终形成新的内存分配器架构,还添加了运行时配置选项等。
- phkmalloc 性能提升明显,但也带来了一些麻烦报告,如 John Dyson 和 Bill Paul 指出的问题等。
- 2003 年 Stefan Esser 发现 CVS 中的 double-free 漏洞,后有人展示可利用该漏洞,说明 phkmalloc 虽有一定安全性但仍可被攻击。
- 在 USEnix ATC 1998 上介绍 phkmalloc 时引发各种反应,作者深受触动。
- 后来多线程和多 CPU 系统的发展使得 phkmalloc 的结构不再适用,Jason Evans 接手维护工作。
重要细节: - 死亡抖动是因为释放内存时要遍历 free 链表,可能导致内核将未使用的内存分页到 RAM 中。
- 作者为检测常见错误将元数据与内存块分离,使用二进制“伙伴”布局。
- 通过符号链接设置运行时配置选项,如“abort(2)”等。
- phkmalloc 对一些简单的缓冲区溢出攻击有抗性,但仍可被攻击,如 CVS 漏洞。
- 在 USEnix ATC 1998 上的经历,包括与 Kirk Mckusic 的互动等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。