windows音频设备图形隔离_Windows对决OS/2 (上)

2eb1268540eff5abcbb5c3e9639a9b20.png

这是一个备胎翻身上位的故事。

按照流传甚广的阴谋论,Windows成功是因为微软故意在与IBM联合开发OS/2时使坏一直拖延时间,直到Windows技术成熟突然杀出。真相并非如此。九十年代初美国联邦贸易委员会FTC曾对此展开调查,把微软决策层备忘录和通信记录都扒了出来。结果证实,在Windows 3.0意外火爆之前,微软的开发重点确实一直都在OS/2上,Windows仅是个备胎。

那Windows是如何干翻OS/2备胎上位的呢?故事要从第一代IBM PC讲起。

初代PC的不足

第一代PC搭载的CPU是Intel 8088。8088有20根地址总线,最多能访问1 MB(2^20=1,048,576)地址。在设计PC时IBM工程师把地址从00000h到9FFFFh的640 KB,即所谓的conventional memory,划给了操作系统和应用程序;剩下384 KB地址(Upper Memory Area)则保留给了BIOS、显示存储、及各种外设。图

a4cf1704dda4c89dc107822707115591.png
初代PC内存地址示意图

因此不管电脑的物理内存有多大,应用程序最多只能使用640 KB。这就是臭名昭著的640K barrier

PC第二个重大的不足是它无法多任务执行。原因是8088没有内存管理单元MMU,缺乏硬件级的内存保护,程序能拿到真实的物理地址。假如运行多个程序,没有MMU把不同程序的内存隔离开,很容易触发内存冲突系统崩溃,又或正常的程序被植入恶意代码导致电脑中毒。

PC刚上市时个人电脑最高配置内存才64K,640K似乎遥遥不可及。然而没过多久,随着行业发展,特别是大型电子表格软件对内存需求,突破640K瓶颈迫在眉睫。为此软硬件厂商想出不少奇技淫巧:

  • EMS Expanded Memory Specification
  • XMS EXtended Memory Specification
  • A20 Gate、HMA
  • LOADALL指令、unreal mode

这些无法根本性解决问题,日后基本上都被淘汰了,且与主题关系不大,这里就不具体展开。640K barrier和无法多任务两件事困扰PC平台近十年。1990年Windows 3.0意外地崛起,关键原因就是解决了这两个问题。

早期尝试

1984年IBM推出新一代PC AT,搭载了Intel 80286。286运行有两种模式,一是实模式(Real Mode),一是保护模式(Protected Mode)。实模式为兼容上代产品,在实模式下286表现就像一枚打了鸡血的8088/8086,依然只有1 MB寻址空间,依然没有内存保护,唯一的提升是CPU运行频率更快了。286只有切换到保护模式,才能发挥其真正的实力。保护模式下,286能够把24根地址线全用上,有了16 MB的寻址空间,有内存保护硬件机制。

乍一看,只要程序跑进保护模式,内存保护有了,可以多任务了,640K barrier打破了,万事大吉。但是问题没那么简单。286从实模式进入保护模式很容易,可是从保护模式退回到实模式非常困难,必须重置CPU,相当于电脑重启。Bill Gates大骂这个设计脑残。IBM在PC AT上设计个硬件解决方案,利用一枚键盘控制芯片Intel 8042发出信号强迫286重置。这个方案不实用,每次切换耗时为毫秒级别,系统开销太大。

无法从保护模式退出的结果是系统生态锁死。因为DOS和BIOS都是实模式,应用软件不敢切入保护模式,进去就无法调用系统和BIOS了;而IBM和微软也不敢把DOS和BIOS改成保护模式,因为几乎所有的DOS应用都跑在实模式里。

此时IBM最佳策略是用其无可比拟的影响力登高一呼,用一个运行在保护模式的操作系统来取代DOS。可惜IBM下不了抛弃DOS的狠心,反而力推自己作一个叫TopView的操作系统。

b77b76a0d7dea4bf0dadf53015c503cc.png
IBM自制的操作系统TopView

TopView是一个跑在DOS上的运行环境,依然受限于640K。TopView最大卖点是支持抢占式多任务。IBM工程师花费大量精力,拿DOS应用一个个进行测试,确保多任务运行。TopView最大的缺点是它跟IBM一样臃肿,耗费大量内存。TopView建议配置512 KB,根据当时杂志做的评测,即使内存加满到640 KB,当打开一个空白的Lotus 1-2-3和一个空白的WordStar,内存就吃光了,想在文档里加几个字或者在电子表格里添几个数据,程序立马崩溃。主打卖点成了摆设,TopView自然扑街。

IBM PC业务负责人在反思TopView的失败时还发现另一个问题:IBM不善写软件。IBM习惯将开发队伍打散分布到不同的城市,这样一旦项目取消,不会对当地经济造成重大冲击,避免了政治上反弹。可如此一来,各个队伍之间交流不通畅,沟通成本高。写软件这种辛苦活交给别人干就好了,只要设计由自己主导,IBM想。

扑街的不止TopView,微软的新操作系统Windows 1.0也遭市场冷遇。Windows 1.0失败原因,主要是微软自身问题,缺乏IBM支持也是原因之一。微软在Windows吹风会上拉来了几乎所有的PC厂商,唯独IBM缺席,而IBM当时占九成市场份额。Windows失败让Bill Gates认识到微软此时的影响力不足,越发意识到新系统的成功绝对离不开IBM。

一个想招小弟写软件,一个想抱紧IBM大腿,双方一拍即合在1985年达成协议,联合开发新的操作系统,OS/2项目由此启动。

矛盾重重的合作

双方的联姻从一开始就矛盾重重,为后来的离婚埋下了种子。

联合开发协议墨迹未干,IBM就心生悔意,派人重新评估这份协议,想踢开微软。为了安抚IBM,Gates曾提议出让10%的股票,这样IBM也能从微软的成功里获益,IBM婉拒。

双方高层勾心斗角,一线程序员之间也矛盾重重。

  • 年龄代沟。IBM程序员公司老员工,平均四十岁,写cobol出身;微软程序员多大学刚毕业,二十多岁,学的是C。
  • 企业文化。IBM员工西装笔挺,工作上习惯朝九晚五;微软员工穿着随便,上下班随心,码代码累了,出门玩玩Freebie。IBM找人开会通报进度,微软程序员骂娘,“老子码了二十小时代码,刚刚躺下睡觉。”
  • 经济条件。微软股票上市后,员工成了百万富翁。而IBM员工拿的是死工资,特别是想到微软成功靠的是抱IBM大腿,心中自然不平。
  • 员工水平。IBM里有高手,上限很高,但因终身雇佣制,队伍里也有不少滥竽充数的,拉低了下限。微软上限先不说,但采用残酷的末尾淘汰制,下限不低。

两家公司在管理方式上冲突也很大。IBM采用以每一千行代码为单元来衡量程序员的工作量。微软强烈反对。指出这样做会激励程序员灌水,让代码臃肿不堪。IBM顽固不知变通,坚持老套的评估方法,甚至在微软精简了IBM提交的代码后,要求微软赔钱补偿工作量。另一方面,IBM抱怨微软测试员太少,程序员写代码不加注释

技术上两家也有分歧。在IBM的计划里,OS/2 1.x 针对80286开发。Gates则力主抛弃80286,改攻英特尔刚推出的80386,第一枚32位的x86微处理器。这样做的好处主要有:

  • 386革命性地加入了Virtual 8086 mode。V86模式通过硬件虚拟化8086,在DOS程序看来自己是运行在实模式里,其实V86是保护模式的子模式,各个程序的内存是隔离开来的。操作系统可以创建一个或多个V86,让多任务变得简单。
  • 16位时代,CPU连续寻址空间只有64KB,内存管理采用区段式segmentation。386有32根地址线,连续寻址空间达到4GB,内存从区段式改成分页式paging,大大简化了编程,特别是对虚拟内存使用上。
  • 英特尔在微软和康柏敦促下,加入新的指令,使得保护模式切换到实模式更方便。

IBM有条铁律,一旦向客户做出承诺,不惜一切代价都要实现。IBM早已承诺OS/2会支持PC AT,所以拒绝了Gates的提议。85年286市场保有量巨大,搭载386的PC离上市遥遥无期,IBM的决策倒是并非没有道理。但是IBM严重低估了系统开发难度,高估开发速度。在开发第二代OS/2时,IBM抛弃了一代里的16位代码,用386汇编从头开发2.x,严重延迟了上市,是OS/2落败的一个重要原因。

OS/2 1.x 和 Windows 2.x

23e0c409acddcff94141de7de359104d.png
时间线 part 1

OS/2 1.0 跑在286的保护模式里(说明一下,微软程序员发现一个叫triple fault的技巧可以用来强迫286重置,比老方法快了一个数量级)。OS/2单独做一个DOS虚拟机Virtual DOS Machines ,来运行DOS/实模式程序。原生的OS/2应用运行在保护模式,没有640K 限制,可以抢占式多任务;DOS应用依然受640K限制,无法多任务执行。而且DOS虚拟机需要实模式,所以当运行DOS程序时,原生应用必须中止挂起。

综上,OS/2 1.0 在运行DOS程序时需要耗费更多内存,且存在不少兼容性问题。此外1.0没有图形界面,只有一个类似DOS的命令行界面。

f1cf4e7c8a246b47973badda6319a6cb.png

用户为什么放着DOS不用,再花300美元买一个比DOS更吃内存,兼容性又不佳的操作系统呢?OS/2 1.0销量扑街。

1.1版终于有了图形界面,名叫Presentation Manager,其界面设计与Windows 2几乎完全一致。

1b394664d04f228258127324ed9a8012.png
OS/2的图形界面

b8a7dbd4cedb6de06bfcaad434d445f0.png
Windows 2.0界面

这不是巧合,IBM一开始打算自己掌控API和图形界面设计,只让微软参与OS/2内核的制作,做完就甩掉微软,后来发现在英国的开发队伍缺乏开发GUI经验,不得已才同意让微软继续参与,并全盘采用了Windows界面设计。

OS/2开发共有四支队伍,内核制作IBM和微软各派一支队伍,图形界面也各派一支队伍。四支队伍的领袖相互鄙视,哪怕是一家公司的。遇事经常扯皮,一扯就从西海岸扯到东海岸,再跨过大西洋继续扯。这造成OS/2开发进度缓慢,1.1版88年底才发布。

也正因OS/2进展缓慢,才有了Windows 2.x。

“做Windows 2是为了Excel和Word有个家”,当年Ballmer是这样向员工解释的,因为Excel和Word想打入PC平台,必须得先有一个图形界面运行环境。做Windows 2也不光是为了自家软件。OS/2吸引了许多开发者的兴趣,可是图形界面难产,让开发工作无法展开。微软不断向开发者宣传,Windows 2采用与OS/2同样的界面设计,你们先在Windows上开发,OS/2完工后,我们会发布工具帮助移植过去。顺便说一句,这也是当年苹果把微软告了的真正目的:杀鸡儆猴。让苹果如芒刺背的不是Windows 2,而是业界一致看好的OS/2。

Windows 2.x有数个版本。微软当时最好的程序员都在OS/2组,Windows组人手捉襟见肘,所以技术上没什么大突破,唯有Windows/386这个版本值得一提。Windows/386利用了80386的Virtual 8086 mode,能抢占式多任务执行DOS应用(Windows应用则是Cooperative multitasking协作式多任务)。

OS/2 1.1 版如果配上足够内存还是很好用的系统,可惜它生不逢时,出生便遇到内存大涨价。内存价格从1985年时每MB880$,1987年降到到133美元,1988年内存价格一路上涨,高达每MB500$,并维持了两年多。大概有两个原因。八十年代日本企业在DRAM市场掀起价格战,逼得美国半导体公司撤离内存业务,市场竞争少了。另一个因素是当时处于内存工艺升级的节点,每块芯片从原先256K升到1 MB。各家公司的生产流水线要么在升级改造,要么在磨合工艺,供应能力大降。DOS和Windows只需要1MB内存就能跑,而OS/2 1.1 需要3MB。高昂的使用成本让消费者对OS/2望而却步,低迷的市场份额打消了软件开发者的热情,OS/2就此错失了发展最佳机会。

即便如此,微软依然把赌注压在OS/2上面,内存价格总会降下来的。Windows 2原本就是临时替补,OS/2 1.1 推出后便失去存在的意义,微软便打算把Windows砍了。当然我们现在知道,历史并没有这样发展。是谁拯救了Windows的命运呢?

请看下篇

王知:​zhuanlan.zhihu.com

资料来源与注记

  • 限于篇幅,本文只勾勒OS/2与Windows竞争中几个关键胜负处。对OS/2本身感兴趣的读者,参见Ars Technica上Jeremy Reimer的文章,此外os2museum.com是个很好的网站。
  • 关于IBM与微软合作开发OS/2这段历史,微软角度叙述参见Jennifer Edstrom, Marlin Eller的《Barbarians Led by Bill Gates……》,IBM角度参见Paul Carroll的《Big Blues, The Unmaking of IBM》
  • 关于Triple fault技巧,见微软Larry Osterman的博文
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值