第20期 | 一个操作系统可以没有页表吗?
一、Linux 线
1991 年,Linux 0.01 在 386 上跑起来,用的是一套两级页表:页目录指页表,页表指物理页,4KB 一页。fork 的时候不急着拷内存——先把页表复制一份,原页标成只读,子进程真写了才分配新页(写时复制)。今天早上我把 0.01 的源码从 kernel.org 历史归档里拖下来看了一眼:mm/memory.c 里 copy_page_tables、un_wp_page、do_wp_page 全在。三十五年前写的代码,长得跟今天一个模样。
同一年,阿姆斯特丹的 Minix 1.5,内存是另一幅样子:没有页表,也没有交换分区。管内存的是一个叫 mm 的独立服务器进程,手里攥着一张"空洞表"——哪块内存空着,按地址从小到大排好。fork 就是找个够大的连续空位,把进程整个拷进去。内存满了呢?没有"先换到磁盘腾地方"这一说,fork 直接失败。
1978 年的 Intel 8086 只有分段、没有分页:20 根地址线,1MB 内存,64KB 一个段。Minix 为 8088 而生,用的 ACK 编译器把规矩定死:代码 64K,数据加栈 64K。1985 年 386 问世——第一款带片上内存管理单元、支持分页的 x86 芯片,4KB 一页。Linus 押的是这块芯片的新能力,Tanenbaum 守的是"能印进教科书"的可移植和简单。Minix 直到 2.0.4 才补上交换分区,文档自承那版交换做得 halfbaked(半生不熟)。连教授最后也不得不向实际低头。
1968 年,MIT 的 Peter Denning 已经把"分页为什么能赢"说透了:程序访问内存有局部性,当下真正需要的只是一小撮页面——"工作集"模型。Minix 的抽屉和 Linux 的分页,差的不是聪明,是对"实际"的态度。分页的原理在 Multics 时代就有了,赢的是把它工程化、产品化的人。杨振宁那句"先实际后原理",1991 年的内存管理就是一则注脚。
二、原生 AI OS 线
如果 AI 的操作系统先出现,内存根本不会被抽象成"线性字节数组"。页表是冯·诺依曼式抽象的登峰造极:把不连续的物理内存,伪装成一条从 0 开始的连续直线。今天的算力主体却是向量阵列——HBM 分 bank,KV cache 分块,注意力按 tile 计算。AI-native 内存的天然单位,是张量块,不是字节页。
"张量页表"会是什么样?表项不再是"虚拟页→物理帧",而是"语义块→位置+精度+驻留层级"。缺页中断变成"缺张量中断":要用的权重不在 HBM 里,触发一次异步取数,计算和搬运重叠进行。
有意思的是,2023 年已经有人把 OS 的分页思想"转世"回了 AI。伯克利的 PagedAttention(SOSP 2023):给大模型的 KV cache 做分页——固定大小的块,按需分配,一张块表做映射,vLLM 靠它把吞吐提了 2 到 4 倍。论文摘要开宗明义:inspired by the classical virtual memory and paging techniques in operating systems。1968 年 Denning 的工作集,1991 年 Linux 的页表,2023 年在 HBM 上借尸还魂。好的抽象会转世,只是每次换一身衣服。
《金刚经》一句,搁这儿正合适:"若以色见我,以音声求我,是人行邪道,不能见如来。"进程眼里那片连续、从 0 开始的内存,本是页表画的一幅画——是色。Minix 倒诚实:连画都懒得精绘,直接给你看抽屉。以地址之相求内存,是行邪道;Denning 问的才是真问题:什么值得常驻。AI 时代新的"色"叫"无限上下文"——别被窗口大小这个相迷住,多问一句:什么配进 HBM。
x86 两级页表(4KB 页):页目录→页表→物理页。来源:Wikimedia Commons 开放许可(X86_Paging_4K.svg)
三、现在动手线:今晚就能亲手称一称页表的体重,机器就在手边:
grep -E 'PageTables|MemTotal' /proc/meminfo
我刚在这台虚机上跑过:8GB 内存,页表自己占掉约 21.8MB——这就是"元数据的税",谁也逃不掉。再玩大一点:用 Python 一次分配 1GB 匿名内存,再看 PageTables,会从 22392KB 涨到 24672KB,多出约 2.2MB。对一下算术:1GB÷4KB=26 万个页,每个页表项 8 字节,正好 2MB,剩下的零头是页目录等上层表的开销。理论和实测在小数点后一位对上了——这种时刻不多,值得截个图。
映射到她手里的四样东西:3090 上跑 70B 模型,KV cache 每 token 约 320KiB,128K 上下文就是 42GB——这正是 Denning 说的"工作集装不进内存"的 2026 年版,PagedAttention 就是解法,vLLM 在 3090 上可以直接装来用;SkyBook 的快慢记忆、存力的温冷分层,都是 OS 内存分层的放大版:热数据常驻,温数据按需取,冷数据换出。1968 年的道理,2026 年还在收租。
觉 然 小 注
初学分布,但求平正;既知平正,务追险绝;既能险绝,复归平正。(化用孙过庭《书谱》)分段是平正,分页是险绝,张量内存当复归平正。
引 用 与 出 处
- Denning 工作集模型介绍(1968 年 CACM 论文,ACM 1968 年度系统最佳论文),http://denninginstitute.com/pjd/pjdbio.html
- Intel 80386 词条(1985 年首款支持分页的 x86 芯片),https://en.wikipedia.org/wiki/Intel_80386
- Minix 内存管理讲义(无分页、无交换,空洞表),http://www.phien.org/ucdavis/ta/ecs150-w04/doc/notes-mm.pdf
- From Minix to GNU/Linux 回顾(64K 段、ACK 编译器限制),https://slidetodoc.com/from-minix-to-gnulinux-a-retrospective-presented-at/
- Linux 0.01 源码历史归档(mm/memory.c 写时复制),https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/
- Kwon 等,Efficient Memory Management for Large Language Model Serving with PagedAttention,SOSP 2023,https://arxiv.org/html/2309.06180v1
- x86 分页结构图(Wikimedia Commons 开放许可),https://de.wikipedia.org/wiki/Paging
· · ·