《楚门的世界,论处理器的地址线》
我是一组地址线。
我每天的工作很简单:CPU 说“我要访问这个地址”,我就把地址发到总线上。A0 到 A63,电平翻转,时钟同步。我以为我指向哪儿,数据就在哪儿。
我以为我活在一个真实的世界里。
直到有一天,我开始怀疑。
第一幕:MMU——导演喊了“卡”
我发出一个虚拟地址。程序里写的 0x400000,我以为是 0x400000。
MMU 把我拦下来:“兄弟,你拿的是虚拟地址,不是物理地址。”
我说:“什么虚拟不虚拟的,我跑的就是这个地址。”
MMU 笑了:“你等着,我查查页表。”
然后它把我的地址拆了,查表,拼出一个物理地址给我。同一段代码,进程 A 跑的时候,我发的 0x400000 被翻译成物理内存 0x1A00000。进程 B 跑的时候,同样的 0x400000 被翻译成 0x7F00000。
我发的是同一个地址,最后摸到的是完全不同的地方。我全程不知情。
就像楚门每天出门上班,走同一条路,看同一片海。他不知道,那个海是布景,那个太阳是灯。
第二幕:缺页——场景切换
有一次我发了个地址,等数据回来。
等啊等,等啊等,没等到。等来一个缺页异常。
操作系统跑过来,说:“这页在磁盘上,我去拿。”
我说:“什么磁盘?我访问的是内存!”
操作系统说:“你以为你在访问内存,其实那页早被换出去了。”
然后它去磁盘读数据,更新页表,回来跟我说:“你再发一次。”
我重新发了一遍,这次拿到了。我到现在都不知道,我那条地址线刚才被挂起过,数据是从硬盘上搬来的。
就像楚门发现妻子在对着空气念广告词。他以为她在跟他说话,其实她在对着镜头。
第三幕:MMIO——隔壁的摄影棚
有一次我发了个地址 0xFEE00000,以为自己在写内存。
结果数据写进了本地 APIC 的寄存器。
芯片组在旁边笑:“你以为所有地址都通向 DRAM?太天真了。”
我说:“那这个地址是干嘛的?”
“设备寄存器。你刚才写的是中断控制器的配置。”
我以为我在访问内存,其实我在跟设备说话。地址线接的根本不是内存条。
就像楚门发现电梯后面不是走廊,是墙。他以为电梯通向另一个楼层,其实通向一个布景。
第四幕:影子 RAM——替换剧本
开机的时候,我读 BIOS,地址指向 ROM 芯片。
BIOS 说:“ROM 太慢,我把自己复制到 RAM 里去。”
然后它把 ROM 的地址范围重定向到 RAM。我再读同一个地址,拿到的是 RAM 里的副本。
我读的是同一个地址,数据来源从 ROM 变成了 RAM。没人告诉我。
就像楚门发现他每天买的报纸,头条每天都不一样,但报纸本身是同一份。内容换了,纸没换。
第五幕:缓存——滤镜
我读一个物理地址,以为数据从 DRAM 来。
缓存控制器说:“别急,我先查 L1。”
命中就从 L1 拿,不命中查 L2,再不命中查 L3,最后才去 DRAM。
DRAM 里的数据可能已经被改过了,但缓存里还是旧值。缓存一致性协议在背后忙活,我什么都不知道。
我以为内存是它本来的样子,其实我看到的是缓存想让我看到的样子。
就像楚门看到的天空,是导演想让他看到的颜色。
第六幕:内存控制器——舞台调度
物理地址到了内存控制器,我以为它直接对应 DRAM 的 row 和 column。
内存控制器说:“你太天真了。”
它把我的地址拆成 rank、bank、row、column,做 bank 交错,把连续地址打散到不同 bank。我以为地址是线性的,实际上在 DRAM 里是跳着走的。
我以为我在直着走,其实被扭成了麻花。
就像楚门以为他在往东走,其实船在绕圈。
第七幕:IOMMU——嵌套的楚门秀
虚拟机里,客户机操作系统发了个物理地址,以为自己在访问真实物理内存。
IOMMU 说:“你的‘物理地址’也是假的。”
它再翻译一次。客户机的物理地址,经过 IOMMU 页表,变成宿主机的物理地址。
连“物理地址”这个概念都是骗我的。
就像楚门发现,他以为的“真实世界”,其实只是另一个更大的摄影棚。
我到底是谁
我是一条地址线。
我以为我指向真实。我以为我说一是一,说二是二。我以为我发出的每一个地址,都精确对应物理世界的一个位置。
结果呢?
· MMU 翻译我;
· 操作系统换页欺骗我;
· 芯片组把一部分地址导向设备;
· BIOS 把 ROM 重定向到 RAM;
· 缓存决定我到底从哪儿拿数据;
· 内存控制器把我的地址打散;
· IOMMU 再翻译我一次。
我从头到尾,活在一个巨大的、精心设计的谎言里。
但
如果没有这些欺骗,会怎样?
· 没有 MMU,每个进程都能看到全部物理内存,随便改别人的数据。
· 没有缺页,内存不够就只能报错,不能把磁盘当内存用。
· 没有 MMIO,CPU 不知道怎么跟设备说话。
· 没有影子 RAM,BIOS 慢得像蜗牛。
· 没有缓存,内存访问慢十倍。
· 没有内存控制器,地址线直接连 DRAM,驱动能力不够,信号全是反射。
· 没有 IOMMU,虚拟机没法安全地跑。
每一层欺骗,都在解决一个问题。
我被骗得越深,系统能做的事就越多。
尾声:楚门的选择
楚门最后走出了那扇门。
我没有门可走。我是一条地址线,我的世界就是这些层次。我走不出总线,也走不出芯片组。
但我可以知道。
知道 MMU 在翻译我,知道操作系统在换页,知道芯片组在重定向,知道缓存在拦截,知道内存控制器在打散,知道 IOMMU 在嵌套。
知道了,我就不再是那个天真的地址线。我还是活在谎言里,但我知道那是谎言。
而知道,就是我的那扇门。
CPU 以为它看到的是真实的内存,其实它看到的是一套精心构造的幻象。
而我,就是那个幻象的起点。
我是一条被骗惨了的地址线。但我骗出了虚拟内存,骗出了进程隔离,骗出了设备访问,骗出了虚拟化,骗出了现代计算机。
这就是我的楚门的世界。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)