← 返回目录


你的电脑里有多少台电脑?

钻研人类记忆,探索复习算法。改善教育公平,践行自由学习。

36 👍 / 1 💬

现代计算机内部包含了许多更小的计算机,从主处理器到硬盘、网卡甚至线缆里的芯片,无不如此。本文盘点了这些组件,并解释了它们隐藏的计算能力为何攸关安全。

为什么你的「电脑」里,有那么多地方能藏匿后门和怪异机器(weird machines)?
因为大东西都是由小东西组成的:你的电脑实际上由几十、几百甚至可能上千块芯片构成。其中许多芯片承载着怪异机器,在显性或隐性地执行图灵完备的计算(许多芯片比过去时代的台式机还要强大),它们协同工作,共同制造出这是一台「单一计算机」的错觉。
后门、漏洞、怪异机器以及安全问题,才不在乎你怎么想——它们只在乎去哪里能找到资源,并将其编排成一场计算。

如果说「现在的网络就是计算机」,那么「现在的计算机就是(由众多计算机组成的)网络」,这话同样不假。 也许像 Altair PC 这样最早期的计算机里,真的只有一台「计算机」,所有图灵完备的任务都必须从同一个地方通过。但那个时代早就结束了。如今的「计算机」由无数组件构成,其中许多组件要是放在过去,本身就是一台好用的计算机。 「计算机」这个称呼只是为了图方便,并非什么泾渭分明的界限。 真正重要的是输入和输出:作为一个整体,系统能力有多强?需要什么资源?怎样才能重新编程这些组件?

层次

没人关心谷歌底层究竟是 50 台超级计算机、5 万台大型机、500 万台服务器,还是 5000 万个嵌入式/移动处理器,抑或是上面这些硬件的大杂烩。它们利用了五花八门的芯片,从定制的「张量处理单元(TPU)」到定制的片上硅(英特尔曾为几个大客户在至强芯片上做过这种定制),从 FPGA 到 GPU 再到 CPU,甚至还有更稀奇古怪的硬件,比如定制的 YouTube 视频编码芯片或处于原型阶段的 D-Wave 量子计算机——只要谷歌能跟其他科技巨头一较高下,并以合理的成本提供服务,这就够了。 (如今的「超级计算机」大体上就是一大批机架式服务器,塞进了多得异乎寻常的 GPU,再用快得异乎寻常的 InfiniBand 网络连起来,跟数据中心也没太大区别。) 这些硬件,任何一块都能根据其运行机制,在诸多不同的计算层级上支撑起多台怪异机器。 这个系统可以从多个层级去审视,每个层级的视角虽说都不完全严谨,却各有各的用处。 你到底是一个「单一的生物智能体」,还是由人体细胞、神经元、细菌、酵母菌、病毒和寄生虫组成的群落/生态系统?这究竟要紧吗?

计算机嵌套计算机

插图:XKCD #2166,「堆栈」。

这个问题本身边界模糊,这里有个现成的例子:此时此刻,不管是你的桌面上还是口袋里,你到底有几台计算机? 你的「计算机」里有多少台计算机?你以为只有一台吗?咱们仔细瞧瞧——里面全是大大小小的计算机。 你可能以为,除了主板上占据 C 位的那个大个头 CPU,顶多再算上 GPU,就没别的了。但实际上,整个系统可调用的计算能力远远超出了 CPU 和 GPU 的范畴。原因有很多:大规模量产使得晶体管和处理器核心变得极度廉价,因此在很多情况下,出于实时性或高性能的要求,为了提供安全保障,为了避免主操作系统因某项任务而不堪重负,或者为了兼容老旧架构与现有软件包,人们往往觉得干脆单拉一个核心出来处理更划算。此外,由于给 DSP 或通用核心写程序,比专门去造一个特定的 ASIC 来得快,或者说,随手拍上一块小 CPU 才是最快捷的解决方案,根本不值得为了省那几毛钱去费心思……[1] (Halvar Flake 将这种现象戏称为「廉价的复杂性」。) 只要有外设或设备被制造出来,「轮回之轮」就开始转动了。 更有甚者,许多组件哪怕原本并非用作计算,或者刻意隐藏了计算功能,依然可以被当作计算单元来使唤。 (比如,Commodore 64 的软驱里运行 Commodore DOS 的 CPU ,就被拿来当成额外的备用算力,或者用来破解防拷贝机制,因为它跟主 CPU 一样强;你可以把计算分形、为演示动画做 3D 数学运算、跑国际象棋程序等任务甩给这个「协处理器」……)

往下探究

由此可见:

我们是群落

所以,一台台式机或智能手机里理所当然地藏着 15 到几千台不等的「计算机」(所谓「计算机」,是指图灵完备的设备,能够以通用的方式进行实用编程,且几乎不需要在「官方」计算机上运行代码)。它们拥有的强大算力,足以跑得动计算史上形形色色的许多程序;而对手自然能利用它们来监视、窃取数据,或是对系统的其余部分发动攻击。

纵观历史,这不足为奇。哪怕是最早的大型机,往往也是由多台计算机组成的:主计算机负责批处理,额外的小型计算机则接管高速 I/O 操作;如果不这么安排,光是中断请求就能把主计算机给憋死。

实际中,除了计算机安全圈(因为这些计算机通通不安全,正好成了好用的攻击路径),一般用户才不在乎我们的计算机底层有多么错综复杂,更不在乎它准确来说就是数百台被生硬拼凑在一起、大杂烩般的计算机群落。只要它运转正常,用户就会觉得这就是一台功能强大的独立计算机,并拿它当一台来用。

直到它不再按预期运转为止。

外部链接

尾注

[1] pkaye 在 HN 上举了这种心态的一个例子:

让我想起以前做固件开发时,ASIC 团队跑来问能不能顺手塞个额外的 Cortex-M3 核心进去,好解决特定的控制问题。这些核心会被当成可编程的状态机来用。对 ASIC 团队来说,跟专门去设计定制逻辑电路相比,随便扔个核心进去根本不花什么成本。然而,对固件团队来说,这就意味着又多了一份编写和测试固件的差事。我们有的设计里塞了多达 10 个 Cortex-M3 核心。我听在另一家公司上班的朋友说,他们那边塞了差不多 32 个这种核心,调试起来简直生不如死。

[2] 例如,2017 年的 Intel Core i9-7900X CPU 拥有总计约 24MB 的缓存,这比 1996 年的台式机 Power Macintosh 5200 LC 那 16MB 的内存(CPU 缓存只有 16KB!)还要大得多。

[3] 或者它们跑着看似无害的浮点运算,实际上却利用开启非线性的浮点运算设置编码了一个(深层)神经网络。另见《神经网络的对抗性重编程》,Elsayed 等人,2018 年与 Neekhara 等人,2018 年(说得更宽泛点,参考 GPT-3 / CLIP 的「提示编程」,或 Goyal 与 Bengio,2020 年 / Lu 等人,2021 年)。一个相关的话题是「机器教学」:Zhu,2013 年,Zhu,2015 年,Wang 等人,2018 年,Sucholutsky 与 Schonlau,2020 年。

[4] Arrigo Triulzi 在 2008 年演示过一套漏洞利用系统,该系统结合了对网卡(计算能力有限)和 GPU 的黑客攻击,使其能够独立于主机操作系统 / CPU 运行:《Project Maux Mk.II:「网卡已拿下,现在我想要个 Shell!」》 / 《绝地武士的数据包戏法接管死星(或者:「将网卡后门提升到新高度」)》。

[5] 每年我都把同一张 SIM 卡从旧智能手机里拔出来,再插进新手机,这总让我浮想联翩:它就像一个长生不老的微缩「蜂窝小矮人」——它到底在想些什么,又真正效忠于谁?

[6] Ken Shirriff 在拆解分析 Macbook 充电器时打趣道:「一块带微控制器的微型电路板成了意料之外的组件,如上图所示。这个 16 位处理器不间断地监控着充电器的电压和电流。当充电器连接到 Macbook 时,它开启输出;断开连接时,关闭输出;一旦出现问题,直接切断充电器电源。这个处理器是一块德州仪器的 MSP430 微控制器,性能跟初代 Macintosh 里的处理器差不多。[充电器里的处理器是一块 MSP430F2003 超低功耗微控制器,拥有 1kB 闪存和区区 128 字节的内存。它内置了一个高精度的 16 位模数转换器。更多信息在这里]。」


Thoughts Memo 汉化组译制
感谢主要译者 gemini-3.1-pro,校对 Jarrett Ye
原文:How Many Computers Are In Your Computer? · Gwern.net

专栏:Gwern Branwen


← 返回目录