失落的 malloc:从 Unix V4 源码看内存分配的起点
来源:napcakes.nekoweb.org — 2026-11
📋 概述
一次 Unix 考古。V4 磁带去年才在储藏室被找回来,1973 年 11 月发布的它已经能把内核大部分写成(中古)C。作者先看 C 编译器工具链里 /usr/c/c20.c 的 alloc():对齐、检查边界、不够就 sbrk(2000),失败直接 exit(1),所以调用方从不检查 NULL,也从不 free——反正一切活到程序结束。真正有意思的是 Dennis 目录下的 malloc.c:malloc(mp, size) 与 mfree(mp, size, addr) 多了一个显式的 map 参数,coremap 与 swapmap 就是两块扁平内存区域;mfree 还需要传对象大小。
🔑 核心要点
- 因为扩堆走
sbrk(),扩容时不会让已有指针失效。
- 作者认为这套接口远优于现代 malloc/free:丢掉整个区域就能回收第三方代码的全部内存,堆损坏也能靠分区限制影响面。
- 他顺手指出当年的 map 尺寸写小了一半,本应是 CMAPSIZ/2 与 SMAPSIZ/2,后来修了。
- V6 改用按地址有序的块表做 first-fit 加相邻合并,「arena」一词最早出现在 V6 的 alloc.s 注释里;V7 才出现 ALLOC(x) 宏。
💡 金句
这些接口比传统的 malloc / free 好上无数倍。
👍 0
👎 0
← 返回 Lobsters 首页