对操作系统开发相关的一些问题的思考
在从事操作系统开发过程中,对操作系统相关的一些问题尤其敏感。下面这些内容,都是就一些典型的问题或观点,与朋友或同事有过讨论之后,形成的一些个人结论或想法。只是一家直言,不免有片面之处,欢迎朋友们批评讨论。
对未来操作系统的发展趋势的思考
我认为,操作系统正朝着按应用场景细分的方向发展,即针对每种应用场景,或某个特定的用户群,会有一个或多个与之适应的操作系统。比如,以前的操作系统,大致可分为桌面操作系统、服务器操作系统和嵌入式操作系统等三个大类。Windows、Linux是桌面操作系统的典型代表,UNIX操作系统在服务器(或大型机)领域一家独大,嵌入式领域,则存在pSOS、VxWorks、ucOS等操作系统。而到了当前的移动互联网时代,智能移动终端这个应用场景出现后,又催生了广泛应用于智能终端上的Android操作系统、Apple iOS操作系统等。随着云计算的兴起,云操作系统又有流行的趋势。可以看出,操作系统的类别(或种类)并不是一成不变的,而是随着应用的不断变化和演进,会有全新的操作系统被开发出来,以适应这些应用。总体呈现出一种按照应用场景进行细分的趋势。
随着移动互联网的不断发展成熟,会逐渐催生出更多的应用场景,比如家庭网络、物联网等。由于体系结构的限制,传统的操作系统很可能不能适应这些新兴场景的需求,因此又会催生出一批更新的操作系统。
本质上,这是由于人类的个性化需求不断增加决定的,与汽车等传统消费品的发展轨迹类似。最开始的时候,汽车型号单一,产量供不应求,人们的需求不存在个性化,只要有一辆汽车就行。这时候汽车制造企业的运营模式,是典型的存货型运营模式,即按照有限的几种型号,生产大量的汽车并库存,然后投放市场。随着汽车市场的饱和,人们的需求已不局限于有一辆汽车,而是要有一辆个性化的汽车,这样就催生了各种各样的汽车品类,比如SUV、商务车、跑车等。为满足个性化需求,一种汽车型号(或平台)已经不能满足需要,汽车制造商不得不推出不同的基础汽车平台,这些不同平台之间已经不能相互兼容。计算机发展轨迹与此类似。以前,人们只要有一台计算机就可以了,没有太多个性化需求(当然,个性化的硬件配置和个性化的软件,不能算本质的个性化需求,因为这些个性化特征,都是由统一的计算机平台满足的)。这个时候,计算机生产厂家只要生产一种计算机-IBM PC兼容机,即可满足客户需求。相应的,只要有一种操作系统,理论上就可满足所有人的需求。随着计算机的普及和网络技术的发展,一台计算机已经不能满足个人需求,人们不但希望能够在家里或办公室里使用计算机,更希望能够在任何时候都能够使用计算机。这样就催生了PDA、平板电脑、智能手机等设备的诞生。原来的操作系统已经不能适应这些新兴设备,于是新的操作系统应运而生。
因此,操作系统随应用细分,以适应人们的个性化需求,必然是一种趋势。个性化的极限情况是,每个人都有一台独特的、适应自己的计算机,对应一个独特的、专门满足这个个体的操作系统。即在极限情况下,操作系统的数量,应该与人的数量相同。这符合经济学原理,因为只有完全满足每个人的独特个性化需求,才能挖掘出全部的消费者剩余,从而使得计算机厂商的受益最大。
当前虽然已经有很多成熟的操作系统,但离真正的计算机个性化需求满足,还有非常大的距离。操作系统的数量,必然会以越来越快的速度增加。
在当前各类操作系统已相对成熟的环境下,开发操作系统是否有必要?
我认为非常有必要。根据上面的分析,操作系统会越来越呈现出应用场景细分的趋势,一个或几个通用的操作系统,已经不能覆盖所有的场景需求。这种情况下,新的操作系统需求就呈现出来。这时候如果能够提前发现这种新的应用场景,并及时开发出对应的操作系统,不论经济效益还是企业商机,都是非常大的。比如Android,其开发人员就是看到了移动互联网时代智能手机会得到广泛应用,而传统的操作系统又无法适应这种应用,于是才决定投入开发的。当然,这其中可能有其它因素,但是选定应用场景,并持续投入开发,是其成功的主要因素之一。
但是不能盲目开发,一定要选择一个应用场景,针对场景的需求,做定制性质的开发。这里的难点是如何识别出应用场景,而不是操作系统开发本身。这就需要靠开发组织的业务嗅觉能力了。我个人认为,云计算终端可能是一个未来应用空间巨大的新场景。云终端的应用有其自身独特的地方,比如需要有很强的网络能力,能够支持各种网络接入技术,同时需要有较强的图形处理能力。而且其软件部分尺寸不易过大,在必要时能够很快进行重新安装,而不影响客户应用。还要有很强的被管理能力,能够按照维护指令,做一些升级、打补丁等动作,甚至重新安装。而且还需要考虑用户认证、通信加密等功能。显然,已有的操作系统不能完全满足这种需要,开发一种最新操作系统的需求必然会出现。
再举一个例子,比如家庭网络应用中的家庭网关(HG,Home Gateway)。家庭网关需要支持多种多样的无线和有线接入技术,需要与各种各样的家用电器连接,比如电冰箱、空调、家庭电脑、电视机、微波炉等,有时候甚至需要与门铃、门锁、窗帘等完成连接。这需要非常复杂的数据处理能力和通信能力,同时要高度安全、高可靠、高效率。还有一些其它的需求,比如人脸识别、生物认证技术等。在已有操作系统上增加这些特性,其复杂度可能会比重新开发一个操作系统还要大。因此针对这种场景,开发一个专门针对家庭网关的操作系统,是非常有必要的。
还有很多其它的场景,在此不一一列举。总之,随着应用场景的细分,硬件的个性化,操作系统开发需求不但不会消失,而且会以越来越强劲的势头凸现出来。
什么样的公司适合开发自己的操作系统
我认为,直接面向终端用户的IT公司,都可以通过开发自己的操作系统来增强其竞争力。比如提供互联网服务的ISP,提供通信服务的运营商(Operator),销售终端产品的终端供应商,甚至一些非IT公司,比如汽车制造商,也可以通过开发自己的操作系统来增强核心竞争力。一个原则就是,只要直接面向终端用户,为终端用户提供服务或产品,都有潜在的操作系统开发需求。主要是因为,操作系统是业务终端的最核心软件(也是最核心部件),只要控制了操作系统,就控制了业务终端,进而达到保持用户、增强用户忠诚度的目的。同时,以一个自有产权的操作系统为基础,可以派生出非常多的终端类型,来满足各种各样的业务需求。这样在竞争中,企业就有了主动性,通过不断的业务创新,使得企业永远位于产业链的前端,做行业的领导者而不是跟随者。
以苹果公司为例,正是由于其拥有完全自主知识产权的iOS操作系统,才使得其在产品推陈出新、更新换代的过程中始终保持在同行的前列,通过重复使用这个操作系统,开发出各种各样的新颖产品。假设其没有自主知识产权的操作系统,而利用第三方的操作系统,那就受限于操作系统本身更新换代的影响,很难及时推出有差异化的产品。
总之,在用户直接接触的终端领域,操作系统是最高的战略高地。只要占领了这个高地,就意味着建立了在整个领域内的王者地位。但是,操作系统的开发也不能盲目进行,必须找到一个符合自身整体战略规划的应用领域,针对这个领域进行开发。比如Alibaba公司,就针对云计算自主定制了自己的操作系统。我认为这是一个非常明智的举措。
最后再着重说明一下,开发自己的操作系统,并不意味着一定要自主开发,也可以选择在已有开源操作系统基础上进行定制。比如,现在很多互联网服务提供商,就是在Android基础上开发定制自己的操作系统的。这种操作方式,不能算是完全的自主开发,可称为自主定制。相对自主开发,自主定制方便快捷,投入少,而且短期内的目标都可达到,不失为一种便捷的措施。但是从长远来看,这种方式的竞争力远远不如自主开发操作系统的竞争力强。因为自主定制的操作系统,在大部分功能上,很难赶上或超过其基础操作系统的开发进度和更新速度。即使定制厂商不跟随基础操作系统的主版本计划,自己完全建立一套从内核到应用的开发流水线,也会因为跟不上硬件平台的变动,而最终落伍。除非厂商有足够的实力,既能够跟上硬件平台的更新换代,又能够完全掌握基础操作系统代码。而这种情况下,大部分厂商一开始就会选择自主开发,而不是自主定制。因为前者的竞争优势远远大于后者。
操作系统开发难度是否真的很大?
纯粹从技术上说,相对二十世纪,当前操作系统开发的难度已大大降低,甚至低于很多应用软件开发的难度。主要有以下一些原因。
首先,目前存在很多开远的操作系统,可供开发过程中的参考。虽然开发的目标操作系统的架构和核心功能与现有操作系统不一致,但是一些关键的机制,比如线程同步、内存管理算法等,很大程度上都是相通的,可以参考借鉴已有操作系统的实现思路。
其次,不存在人才壁垒。计算机行业中有非常多的系统软件开发人才,这些人才的水平和经验,足以支撑操作系统的有效开发。
再次,当前已有非常多的功能模块代码,可直接在操作系统开发过程中引用。比如图形库,当前有很多的开源图形库可供直接应用。如果说以前开发操作系统是从零开始的话,现在开发操作系统,就是站在巨人的肩膀上进行开发。除非是你希望体验一下从无到有的整个过程,否则没有必要所有模块都完全重写。
最后,也是最重要的,操作系统过程中需要的技术和知识并不是非常复杂。比如操作系统核心模块的开发,几乎不会用到复杂的数学推导和运算,只要有最基本的数据结构知识和硬件知识就可以胜任。而在一些应用软件开发过程中,比如GIS,图形处理软件,需要有非常深入的数学知识,比如复杂的矩阵运算、高阶偏微分方程等,这对程序员的要求非常高。对比起来,操作系统开发难度,比复杂应用软件开发难度低得多。
总之,操作系统开发没有想象得那么难。人们之所以一听到操作系统开发,就认为非常难,甚至望而却步,我认为很大程度上是心理作用。因为我们从未成功开发出一个操作系统,不知道操作系统的开发难度如何,于是会产生一种对无知的畏惧。
打造出一个广泛使用的流行操作系统的难度,在于建立一个完善的操作系统生态环境。这包括操作系统本身,与操作系统配套使用的开发工具,与之配套使用的浏览器、多媒体播放器等软件,为其定制的各种硬件驱动程序,以及支持它的众多硬件平台。这不是一个开发团队或一个公司能够独立做到的,必须借助于整个行业的力量,包括硬件设备提供商、应用软件开发商、系统软件开发商等的通力合作才能完成。而且整个生态环境的成熟,需要很长时间,有时会超过十几年时间的培育。再强调一下,这里说的生态链,是针对一个通用操作系统来说的,比如Linux,Android等。
当然,这并不是说操作系统开发就没有任何机会了,相反,开发的机会还会越来越多。之所以这样说,就是基于先前论述的应用场景细分趋势。在操作系统应用场景细分的情况下,操作系统的生态链范围会大大缩小。一个优秀的公司,以自己之力甚至就可以打造一个完整的生态环境。
怎样的操作系统才能算是独立开发的操作系统
这个问题可能比较敏感,而且见仁见智,这里只是说一下我个人的理解。我认为,一个独立开发的操作系统,下列各模块中,至少要有一个是完全独立开发的(即不重用任何现有模块,完全是重新独立编码):
操作系统内核,这里的内核,包括基本的操作系统服务,比如进程/线程模型、内存管理机制、设备管理机制、核心设备驱动程序等;
图形用户接口(GUI),可以直接借用现有的图形库,但是GUI不仅仅是一个图形库,还包含了用户交互机制、图形资源管理等相对比较复杂的内容。这些内容需要自行编写;
全新的应用编程接口和开发工具。比如,在原有操作系统核心基础上,增加的API调用数量,要超过原有内核体统的API数量,这些API组合起来,提供一种全新的应用解决方案或应用场景。同时要开发一个全新的应用程序开发环境,并能与操作系统和最新的API有机集成,提供面向某个应用场景的整体解决方案。
比如Android,虽然其操作系统核心是借用的Linux内核,但是其GUI却是完全重新编写,且提供了一个基于Java语言的全新开发环境,上述列举的模块中,有至少两个是全新编写的,因此Android属于一个独立开发的操作系统。当前市面上有很多号称是自主开发的操作系统,实际上只是把Android的GUI模块进行了部分修改,添加了一些个性化的东西。同时有针对性的增加了一些应用。我认为,这不应该算是自主开发的操作系统,可以算作是自主定制的操作系统。
这里并不是否定自主定制操作系统的行为,而是从技术上,试图把自主开发和自主定制进行澄清。实际上,自主定制是一种非常明智的行为,可以使得企业能够很快推出其个性化产品,满足市场需求,是企业积极适应市场需求、积极参与竞争的表现。相反,如果企业纯粹去追求自主开发,在没有明确市场需求和市场定位的情况下,不计成本的投入开发一种全新的操作系统,反而是一种愚蠢的行为。现有的东西能够满足需求,为什么不拿来直接用呢?模块重用原则一向是软件行业推崇的基本原则。
对x86平台在操作系统开发中的作用的考虑
我个人认为,x86硬件平台是操作系统开发过程中无法绕过的一个平台,而且对一些相对通用(这里的“相对”通用,可以理解为至少支持两种以上硬件平台的操作系统)的操作系统来说,以x86为最开始的开发目标平台,完成x86平台的开发后,再向其它硬件平台移植,或许是最有效且最省事的策略。主要有以下几点原因:
首先,可充分利用已有的大量的操作系统相关代码和文档。x86硬件平台是一个高度标准化的计算机平台,不论是其初始化和加载过程,还是常用硬件的资源配置(端口号、内存映射等),都有明确定义。没有任何其它的计算机硬件平台能够象x86这样完善,虽然从纯技术角度上说,x86 CPU本身的体系架构不一定是最优的。真是因为这样的特点,很多系统软件爱好者开发了大量的面向x86平台的操作系统代码片断,放到互联网上共享。这些代码片断包含了操作系统开发过程中的方方面面,是操作系统开发过程中最宝贵的资源。借鉴这些资源和文档,可大大加速操作系统开发过程,尤其是初期的开发过程。
其次,由于x86硬件平台的广泛应用,可大大加快新操作系统的推广和使用速度。一旦有一个操作系统雏形,能够成功引导计算机,并能够做一些基本的操作,只要你放到网上,肯定会有很多的操作系统爱好者下载使用。这无疑会大大提升新开发操作系统的推广范围和推广速度。同时可能会收到大量的对新系统的改进建议和bug报告,有助于操作系统软件质量的提升。
最后,对操作系统的进一步扩展开发有重大意义。比如,你完成了操作系统核心部分的开发,然后公布API接口,设备驱动程序开发接口,甚至源代码,会吸引很多系统软件爱好者继续开发驱动程序和应用程序。这对整个操作系统生态链的构建是非常重要的。如果操作系统是直接面向x86硬件平台的,这个驱动程序和应用程序进一步开发的过程,就无需模拟器的支持,得到的相应必然会更多。
总而言之,如果不是针对一个固定硬件平台做的功能有限的操作系统开发,建议以x86为首要开发平台,以充分发挥已有优势。如果你开发的操作系统非常封闭,只适应于固定的一种硬件平台,则无需开发x86平台版本。但只要是一个功能相对丰富的操作系统,适应多种硬件平台是必然的,这时候,x86就是绕不过的门槛了。
作者:辛庆祥,操作系统开发爱好者,目前正从事开源操作系统Hello China的开发,曾以蓝枫叶为笔名,出版《嵌入式操作系统:设计与实现》一书。QQ:89007638