对抗知识焦虑,从看懂这条开始
App 下载对抗知识焦虑,从看懂这条开始
App 下载
硬件逆向重构|UNIX系统|电路级仿真|虚拟CPU|PDP-11/34A|计算科学|数理基础
想象一下:一台1976年出厂的迷你计算机,机箱上的白炽灯还在按当年的频率明暗闪烁,面板开关拨下时,CPU内部的每一条信号都在以纳秒级精度流动——但它根本不存在于物理世界里。这是ll/34,一个完全用代码逆向重构的PDP-11/34A虚拟CPU。它不仅能运行40多年前的UNIX系统和俄罗斯方块,甚至能复现当年硬件设计里的bug。为什么有人要花这么大力气,在现代电脑里‘养’一台老古董?答案藏在大多数人从未见过的、计算机最底层的信号世界里。
你可以把普通的CPU仿真想象成一家快餐店——只负责把‘指令’做成‘餐品’,至于后厨是用铁锅还是电炉、火候够不够,根本不关心。这就是功能级仿真,快是快,但永远没法还原老硬件的‘脾气’。而ll/34用的电路级仿真,相当于把老餐厅的后厨拆成每一块砖、每一个灶眼,在代码里原样重建。

它没有用Verilog这类门级硬件描述语言——那太细了,运行起来慢得像蜗牛;也没停留在功能模拟——那太粗了,抓不住硬件bug。团队选了中间路线:把PDP-11/34A的ROM真值表和组合逻辑翻译成C语言代码,每一个微指令周期都对应真实硬件的180纳秒或240纳秒,每一条信号的延迟、每一个逻辑门的开合都精确复刻。
举个最实在的例子:真实PDP-11/34A的时钟发生器用了E106延迟线,信号要在里面绕圈才能产生稳定时序。ll/34不仅模拟了这个延迟的时长,连信号反馈的细节都没放过——就像在代码里装了一条看不见的电线,电流真的在里面‘走’了一遍。

如果说电路级仿真是虚拟CPU的‘骨骼’,那微码就是它的‘神经信号’。PDP-11/34A的CPU靠512条48位的微指令驱动,每条微指令控制ALU运算、寄存器读写、总线通信,就像给CPU的每一个动作写了详细剧本。
ll/34的开发者从Bitsavers的Verilog代码和ROM dump里还原了这份‘剧本’,把它存在ucode_rom.h文件里。每执行一条机器指令,虚拟CPU就会调用一串微指令:比如加法运算,要先把数据从内存读到寄存器,再送到ALU计算,最后把结果写回指定位置——每一步都和真实硬件的动作分毫不差。
更厉害的是,它连当年硬件的‘小毛病’都还原了。比如某块ROM的真值表有个错误,导致特定指令执行时会有信号毛刺,真实机器上运行到这里可能会死机,ll/34的虚拟CPU也会一模一样地‘死机’。这可不是bug,是刻意保留的‘数字化石’——只有这样,它才能成为维修老机器的诊断工具。
把一台老电脑变成代码,比从零造一台新的还难。PDP-11/34A的原始图纸散落各处,部分微码甚至没有文档留存。开发者只能靠逻辑分析仪采集真实机器的信号,一点点反推ROM的真值表,把每一块74系列逻辑门的功能翻译成C语言的逻辑运算。
比如组合逻辑ROM里的指令译码模块,要把16位的机器指令翻译成微指令的地址,开发者对着原理图和信号捕获数据,把每一个输入输出的对应关系做成查找表——就像破译一份没有密钥的电报。
他们还做了个内置逻辑分析仪,能监测102个关键信号点,对应真实硬件的芯片引脚。调试时,开发者可以像修真实机器一样,盯着信号波形找问题——而这一切都在代码里发生,不需要焊台,不需要示波器,甚至不需要一台真实的PDP-11/34A。

当你在浏览器里打开那个WebAssembly版本的ll/34,拨动虚拟面板上的开关,看着屏幕上的UNIX提示符跳出来时,你看到的不只是一个仿真器。它是一座连接过去和现在的桥——一边是1976年的硬件工程师在图纸上画下的逻辑门,一边是2026年的开发者用C语言写下的代码。
数字遗产从来不是存在硬盘里的镜像文件,而是能运行、能调试、能让后人摸到‘脉搏’的完整系统。每一条信号的延迟,都是技术的年轮。 这些老机器里藏着现代计算机的根,而ll/34让我们不用挖开博物馆的仓库,就能亲手触摸到它。