作者为了另一个项目去做 Unix 考古,读了 1973 年 11 月发布的第四版 Unix 源码——这是 C 语言出现后的第二个版本之后,内核大部分已经用「中世纪 C」写成的版本,今天 POSIX 世界里很多东西那时就有雏形。巧的是,V4 的磁带一度被认为彻底失传,去年才在清理库房时被找到。文章讲两处内存分配:编译器工具链里那个 alloc() 是一个线性分配器,对齐大小、检查剩余空间、不够就 sbrk(2000) 扩,失败直接退出,所以调用者从不检查 NULL;因为用的是 sbrk,扩堆不会让已有指针失效,而释放则完全不必要——所有对象活到程序结束。真正的发现是 Dennis Ritchie 目录下的 malloc.c:签名是 malloc(mp, size) 与 mfree(mp, size, addr),第一个参数指定 coremap 或 swapmap 这样的内存区域。也就是说分配器天生分区、天生知道大小,比今天的 malloc/free 好在哪,作者列了一整段。