phkmalloc — PHKs 自行车棚

主要观点:作者介绍了自己在 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 的互动等。
阅读 15
0 条评论