坦克为何几乎不使用Windows系统?
在我初入行业的那些年里,跟许多同行一样,我有些天真的偏见。每当看到某种军事装备、ATM机或地铁闸机出现Windows蓝屏时,大家总会在群里尖锐嘲讽:“现在还用Windows?这真是不可思议!”或者“用Windows这种不靠谱的系统,无异于自找麻烦。”然而,后来我了解到了一个真实的军工事故。1997年,美国海军的“约克城号”导弹巡洋舰在进行海上试验时,一名舰员在运行Windows NT 4.0的终端输入了一个“0”,导致了除以零的错误(Divide-by-zero)。这个未被捕获的异常一路蔓延,最终导致整个数据库崩溃,舰船的推进系统停摆,漂浮在海面上整整四个小时。这一事件成为各种技术文章的引用案例,论证了“微软的系统不应应用于严肃的军事场合”。不过,当查阅现代主战坦克的火控及战术终端资料时,我发现事情并不像表面看上去那么简单。
以美军的M1A2“艾布拉姆斯”主战坦克的IVIS(车载信息系统)或德国的“豹2”指挥控制系统为例,它们不仅不使用Windows,甚至连Windows Embedded(后来的Windows IoT)在其核心控制链路里也几乎没有出现。很多人之所以认为坦克不用Windows,是因为蓝屏、系统不稳定或缺乏实时性。但实际上,Windows早期推出过实时版本(例如Windows CE),微软也对其内核进行了各种防护。若从软件崩溃率角度分析,经过优化的Windows Embedded与某些Linux发行版并没有显著差别。真正使坦克抛弃Windows的原因,是一些程序员在编写代码时常常忽视的问题:系统状态的可预测性和在极端硬件环境下的“断电韧性”。
我们可以设想一下主战坦克在战场上的实际环境。坦克并不是数据中心,数据中心具备双重冗余电源、备用电源、恒定温控的机房,甚至有运维人员随时待命。然而,坦克内部的计算机要面对的是怎样的情况呢?包括发动机剧烈震动、主炮发射时的强烈冲击、各类电磁干扰,以及最后也是最致命的,电力瞬时断电和电压骤降。当主炮开火的瞬间,或者坦克跌入掩体时,电源线路突然断开,车载计算机可能毫无警告地失去电力。在这种情况下,Windows的架构设计暴露出致命弱点:复杂的状态隐藏和庞大的后台机制。Windows的核心设计目的是为了“服务于人”,提供良好的用户体验、即插即用(PnP)功能、复杂的注册表配置以及系统恢复点和延迟写入的文件系统缓存,因此它在后台维持着庞大且不可分割的状态机。
在Windows上关机时,内核需要依次通知各个服务、刷新磁盘缓存、更新注册表状态、保存会话。如果在写入注册表或文件系统分配表(FAT/NTFS)的瞬间突然断电,后果会是什么呢?在普通个人电脑上,顶多下次开机时进行几分钟的磁盘检查(Chkdsk),或者弹出修复界面。但在战场上,如果主炮刚发射完,系统却意外断电重启,车载电脑再次启动,屏幕上显示“正在更新系统,请勿关机...”或者直接停在等待按F1继续的磁盘检测界面,那么其代价可能就是整个车组的性命。Windows很难做到真正意义上的“无状态”。它的内核设计天然需要记录信息和保存状态。即便微软后来推出了UWF(统一写入筛选器),尝试将系统盘变为只读,将写入重定向到RAM,但这种在复杂内核之上的“补丁”,依然无法根本改变Windows庞大的启动依赖。
那么,坦克真正需要什么样的系统呢?查阅主流坦克的电子系统方案,我们可以发现,它们的核心火控和驱动控制广泛使用的是VxWorks、LynxOS,或者更加底层的Bare-metal(裸机C/C++加超级简化的微内核)。这些系统有一个共同特征:毫无历史负担,也没有复杂的后台逻辑。只需通电,100毫秒内便可完成内核加载并进入主循环;即使突然断电,系统会立即失去电力而不会出现状态损坏;下一次通电时,它依然能够在100毫秒内恢复到上一次工作的状态。这样的系统无需注册表、复杂的驱动管理,甚至不需要窗口界面和桌面。看似极其原始的这种“生死干脆”的特性,恰是面对严酷机外环境,给予人类安全感的唯一保证。
微软在桌面市场的成功,是基于“利用海量硬件资源和复杂软件来掩盖底层硬件差异,从而降低软件开发门槛”的逻辑。但坦克行业的逻辑完全相反:它愿意为极具定制化的开发投入高额成本,以换取内核的简单与可控。在参与工业控制项目时,我曾经历过一次现场设备因频繁的非法断电而导致嵌入式系统文件损坏。有工程师曾提议直接使用Windows IoT,认为开发便捷,界面友好。然而我当时清楚,选择适合的操作系统在这样复杂的环境下竟显得格外重要。