失落的 malloc:从 Unix V4 源码看内存分配的起点
来源:napcakes.nekoweb.org — 2026-11
📋 概述
作者做了一次 Unix 考古,去读 V4(1973 年 11 月)里怎么分配内存。V4 的特别之处是内核大部分已经用(他称之为中世纪的)C 写成;更巧的是一份 V4 磁带直到去年才在储藏室里被翻出来,此前被认为永久失传。第一条线索在 C 工具链的 c20.c 里:alloc() 就是个线性分配器——对齐大小、看区域够不够、不够就 sbrk(2000) 扩,失败直接 exit,所以调用方从不检查 NULL;用 sbrk 扩堆不会让已有指针失效,而且它根本不 free,因为一切都活到程序结束。他认为最有意思的是 Dennis 目录下的 malloc.c:malloc 多收一个 map 参数,mfree 还要把大小传回来,而 map 就是 coremap 与 swapmap 两块扁平内存区——这种按显式区域分配的接口,今天看来远好于传统的 malloc/free。
🔑 核心要点
- V4 磁带去年才被找回,此前一直被认为已失传。
- c20.c 的 alloc() 是纯线性分配,失败直接退出进程,调用方因此从不需要查 NULL。
- Dennis 的 malloc(mp, size) 与 mfree(mp, size, addr) 按显式内存区工作,天生支持整块丢弃与分区隔离。
- V6 起改为按地址有序的块表 + first-fit 并合并相邻块,Lions 的注释本把算法讲透了。
- V7 出现了 ALLOC(x) 宏替调用方算 sizeof,但只在 f77 与 make 里被用过,说明当时已有多人各自为政。
💡 金句
这是我读过别人代码时最开心的一次——大概是因为它的历史分量。
👍 0
👎 0
← 返回 Lobsters 首页