有人用代码伪造了一台电脑,还骗过了100多个操作系统?

摘要:

你有没有想过,浏览器的上限在哪?二十多年前,浏览器能看个网页小游戏就不错了。后来它能放视频、能听歌、能写文档,现在它能剪视频、能画设计稿、能跑 3A 游戏的云串流。但这些,还有人觉得不够……有一个叫 copy 的开发者,把 100 多个操作系统塞进了浏览器。

从 1985 年的 Windows 1.01 到 Windows 2000,从 Linux、FreeBSD 到 Android,再到 Haiku、KolibriOS、SerenityOS 这些你可能听都没听过的,100 多个操作系统排在页面上,像一部浓缩的计算机编年史,任你挑选体验。


这还不是重点。

重点是,这些系统不是模拟还原出来的,是真正运行在网页里的原版……

是不是没太明白啥意思,别急,马上就知道了。

这个项目叫 v86,网址 copy.sh/v86,免费开源,在 GitHub 上有 2 万多人星标,从 2012 年开始更新一直维护到现在。

世超刷到时也很震惊,就决定去里面试试,挑了一个 Windows 98,毕竟这是咱们这代人小时候摸过的东西。

点进去没几秒,桌面出来了。

说实话,哥们刻在 DNA 里的操作还是没忘,下意识的“开始”-“程序”-“游戏”,启动扫雷……

画面真的和小时候一模一样,世超也和小时候一模一样,懒得算,全凭运气瞎点,三下就炸了。


眼尖的小伙伴应该看到上方动图里有一只羊,会跳到任务栏、窗口上跑来跑去,这玩意叫 sheep.exe,一个桌面宠物软件。

启动后,就会有一只白色小羊在屏幕上跑来跑去,要是用鼠标把它拎了起来,它还会挣扎几下。


后来我又体验了纸牌接龙,画图,说实话都很原汁原味。

但到这,世超还是有点将信将疑:

这真是一个完整的操作系统在跑?会不会只是把几个经典程序用网页重写了一遍,套了层 Windows 98 的皮?

于是我开始挨个验证。

点开控制面板,里面有几十个设置项。Add/Remove Programs、Display、Network、Modems、ODBC Data Sources,世超挨个点了一圈,全都能打开……


你就说 Desktop Themes 的选项,点进去挑了个主题切换,壁纸变了,图标变了,窗口颜色全变了。


甚至点开 IE,进入百度,还 TM 能上网。

虽然因为兼容问题加载得磕磕绊绊,很多字符无法显示,但页面还是出来了。


控制面板能用,主题能换,浏览器能联网,到这三板斧下来,世超算是服了——

总没人会为了一个怀旧网页,做一整套能换主题、还能联网、还有控制面板的皮肤吧?

所以基本可以确定,网页里跑的就是一台 Windows 98 本尊。

但这样的系统本尊,在这个网页里还塞了 100 多个。

比如你能看到 Windows 1.01,桌面极其简陋,只有窗口没有图标,隔着屏幕都能闻到那股古早味。

该说不说,那会审美还挺好,这配色还真挺好看。


你也能体验到 Windows 2000,这个夹在 98 和 XP 之间、很多人压根没用过一两年的系统,桌面上还预装了一堆 Blender、Winamp 之类的老软件。


甚至你还能玩到一个预装了 DOOM、毁灭公爵、模拟城市等经典游戏的 DOS 系统。

输入几行命令,1993 年的地狱大门就在浏览器里打开了。


这还没完……

v86 上面还能体验到 Android-x86,信息、拨号、联系人、浏览器全都有,侧滑还能打开程序列表。

你可能会纳闷,Android不是手机系统吗,怎么也在这?

因为 Android-x86 是一个社区项目,专门把Android移植到了 x86 架构上。既然Android都自己跑到 x86 的地盘上来了,v86 顺手就能把它跑起来了……


现在,世超脑子里就剩一个问题:

这开发者到底是怎么做的?网页里凭啥能体验到这么多系统?

后来看到 GitHub 上的项目说明,我大概明白了。

开发者 copy 居然用代码造了一台虚拟的 PC???

从 CPU、显卡、声卡、网卡都是 copy 用代码伪装的,那些 Windows 系统压根不知道自己跑在网页里,以为是台真机器呢……

但想骗过操作系统,其实不简单。

系统们在启动时,会疯狂试探硬件:读中断控制器的状态、查定时器的频率、往显卡寄存器里写值看反应。任何一个硬件的行为跟真机不一致,系统就会报错或者直接黑屏。


所以 copy 需要用代码伪造一整套硬件的物理行为,精确到每个寄存器、每个时序、每个边界条件。

要知道光模拟一个 x86 CPU 工作量就已经爆炸。

Intel 自己的官方手册,讲指令集这一卷就有两千多页。copy 干的事,是把这两千多页手册里的每一条规则,翻译成 JavaScript 和 Rust 代码,Windows 用的每一条都不能漏,漏了系统就崩。

CPU 只是这台虚拟电脑十几个硬件之一,你再想想其他的呢?

我只能说想想就头皮发麻了。


光有虚拟硬件还不够。操作系统跑的是 x86 机器码,浏览器能执行的是 WebAssembly,这俩语言完全不通,要跑起来得翻译一下。

但翻译也需要时间,所以 V86 采用了 JIT 编译(即时编译)。

程序刚开始跑的时候,v86 逐条指令翻译,翻一句执行一句,这样速度很慢,“电脑”很卡。

但同时,v86 在后台偷偷记录哪些代码被反复执行。一旦发现某段代码被调用的次数超过阈值,就把它整段翻译成 WebAssembly 的编译版本存起来。下次再碰到,直接跑编译好的版本,就快得多。

项目嘛大概就是这样,世超只能说太牛了……

大家感兴趣的可以自行访问,倒是世超好奇:这哥们为什么要做这个项目?

在进行了一点简单搜索之后,我发现这个人很低调,没有公开社交媒体和博客,只知道叫 Fabian Hemmer。


世超顺着他的项目列表往下看,越看越觉得有意思:这哥们很喜欢小的东西。

比如他做过只有 652 字节的俄罗斯方块,456 字节的贪吃蛇,159 字节画出来的 Ulam 螺旋。他还用 K 语言连续做了六年 Advent of Code 编程挑战(K 是一种极端精简的数组编程语言,常见于金融量化领域)。

所以这哥们干的事,翻来覆去就一个主题:把东西往最小的空间里塞,把一个事情做到极限。

可能有人会问,在浏览器里跑 Windows 98 ,搞这些花里胡哨能有啥用?

但 Fabian 还真把这个执念变成了工作。他创建了一家叫 Droplet Computing 的公司,卖的就是让桌面应用直接跑在浏览器里,底层用的还是 WebAssembly,和 v86 一脉相承。

别人是在电脑上装软件,这哥们是用软件搭了一台电脑,再往这台电脑上装软件,最后还把这事做成了生意。

或许极客就是这样,写代码不一定是为了解决问题,有时就是想看看这条路能走多远。

走着走着,路就真走出来了。

撰文:刺猬

编辑:莽山烙铁头 面线

美编:焕妍

图片、资料来源

copy.sh/v86

查看评论
created by ceallan