《网络设备操作系统(Linux .vs. vxWorks)》校注

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享




黄岩在21日发表了网络设备操作系统一文,非常好。笔者试着为其加校注。

————–

网络设备操作系统(Linux .vs. vxWorks)

作者 黄 岩, 2008-12-21 15:16

2001年IBM大张旗鼓的宣布支持Linux,并投入10亿美金用于Linux相关开发。

【陈怀临注:是的,没有IBM Linux Research Center的R&D投入,Linux在服务器市场方面的发展绝无今日之局面】

最近的Cisco抛弃了其专有的IOS核心,在 ASR1000的控制平面软件上采用了Linux为基础平台。【陈怀临注:思科在OS方面目前比较乱了。是的,IOS确实没有能力支持其将来的发展。有兴趣的读者也可参阅弯曲评论相关文章,如“思科的OS战略是用三个OS逐步取代IOS。IOS XR用于核心路由器(Core Router),IOS XE用于边缘路由器,NX-OS用于数据中心的网络交换机。三个都是模块化的OS,IOS XE和NX-OS基于Linux内核(目前Linux的代码质量已经全面超过BSD,JUNOS 1996年起步时Linux还不成熟,如果Juniper现在起步,大概也会选择Linux),IOS XR基于一个兼容POSIX的微内核(Microkernel), 名叫QNX。IOS的各个功能模块被移植到这些新的OS,作为单独的进程运行于内核之上。”—《思科和Juniper的操作系统之争:一个还是多个?】据传Huawei、H3C等厂商的软件平台也纷纷转向以Linux为基础,而以前他们都采用 vxWorks作为基础。【陈怀临注:我个人对华为在这方面的判断力,特别是决断力略表失望。要加快步伐。这与决策者的知识面和视野的局限性有关系。】几年前,就连vxWorks的开发者风河公司也宣布同时支持vxWorks和Linux【陈怀临注:风河:WindRiver Inc. 目前,WindRiver在Linux方面力挺其收购的RTLinux/FSMLab技术方案。相关信息可参阅笔者的陈怀临时间RTLinux/RTCore体系结构】。由此看来,Linux在网络设备领域取 代vxWorks几乎已成定局。这背后的原因究竟是什么?与vxWorks相比,Linux究竟有那些优势?

在我看来,IBM支持Linux,是为了借Linux来挽救其规模庞大的服务器产品线,借助Linux拓展其软件服务市场。(注1)

陈怀临注:是的,IBM不可能是因为,或单纯的因为GNU的道德精神,而投入大把的美金来支持。其主要原因是:扶持Linux,抗衡微软及其联盟。

而网络设备上用Linux,并不在于Linux的技术有多先进,而是Linux所代表的产业链的发展速度超过了vxWorks,用Linux会使软件开发成本更低。

陈怀临注:是的,大量的第三方应用软件,大量的社区人员是Linux生命力和自由软件精神永存的基础。严格来讲,不参考Open Source 源码的工程师不存在。如果有,他要么是什么都不懂,或者其实从来不写程序。】

Linux和vxWorks在技术上的主要差异在于:A、Linux的核心和用户进程之间是的地址空间隔离的,【陈怀临注:这里指System Call Interfac.用户态与核心态的分离。】每个用户进程之间的地址空间是隔离的,当某一个用户进程崩溃的时候,不会影响操作系统核心和其他用户进程正常运行【陈怀临注:这里指每个用户进程拥有其自己的4G逻辑地址空间,共享1G的核心空间,3G的用户态地址空间。】。B、Linux支持页面级的内存管理,支 持换页【陈怀临注:这里指Page on Demand, Copy on Write等Linux内存管理机制。当然,页面PageFault机制带来的效率开销有时也是嵌入式系统所不希望的。所以对一个Linux系统的从新开发和裁剪是很重要的。避开Linux的缺点,最大化的利用Linux的优点。】。C、由于隔离的原因,使得Linux软件的各部分之间耦合性更小,Linux的应用程序跟核心之间有清晰的界面,POSIX API。总而言之,Linux充分利用了现代微处理器的MMU硬件,而vxWorks则采用平面地址空间(注2)。在某些高端设备上Linux的保护模式 的确可以让系统更稳定,至少更容易找Bug。这个特点也是也是长期依赖Juniper赖以攻击Cisco IOS的主要论据,因为Juniper的JunOS是基于freebsd的,也具有同样的特点,而Cisco的IOS核心与vxWorks类似(注3)。

Linux除了具有上述技术优势之外,其实也还有很多缺点,如:(a)Linux的网络协议栈是针对主机优化的, 对于低端路由器这类设备,运行效率不高。(b) Linux的软件镜像较大,占用flash和内存空间大,对甚低端设备来说,成本高。(c)就总体运行效率而言,Linux比vxWorks 差,Linux系统调用开销大,Linux的动态连接库调用的开销也大,在某些硬件上Linux的进程间切换的开销也大等等。【陈怀临注:Linux作为控制平面应该是不错的,System Call的开销不应该是考量。

我认为,Linux相对于vxWorks的技术优势是微不足道的。【陈怀临注:技术优势会变得significant。越来越多的人参与这个社区,她一定会强大。她的后面是一种人文精神团结的数千,数万人,而vxworks后面是最多2,3百人的研发队伍。Eric Raymond的经典文章《大教堂和市集》的问世,基本上奠定了Open Source开发一定超过商业开发的理论基础。】导致网络设备厂商转向Linux的主要原因是 Linux代表产业链越来越成熟,用Linux的开发成本将远低于vxWorks。主要表现在:(a)支持Linux的软件越来越越多,而支持 vxWorks的软件越来越少,Linux下面有很多开源软件,而这些开源软件多半不支持vxWorks。现在用于网络设备的商业软件几乎都支持 Linux,如:Gated、Zebos、Trillium、InterPeek的协议栈等。(b)几乎所有的芯片都提供Linux驱动程序,几乎所有的CPU、评估板都提供Linux支持。【陈怀临注:这一点异常重要。Driver上来就是Linux 版本的。这也是Linux Prevail重要原因之一。一个非常好的正反馈生态环境了】(c)熟悉Linux的开发人员更好找。与Linux相比,vxWorks则越来越显得曲高和寡,其生存环境也越来越差。【陈怀临注:vxworks其实曲也不高,也没什么人和。当年NASA就应该将其彻底掉。Mars Path Finder的Priority Inversion的事故犹如昨天。

对于网络设备来说,选择哪种操作系统软件并不是决定成败的关键因素,操作系统只提供了一些如任务调度、任务间通 信、中断管理、内存管理等基本功能。在一个路由器中,操作系统软件占总代码量的5-20%,而且无论选择那种操作系统,这部分代码都是相对稳定的,不需要作太多修改和维护。但是如果操作系统选择不当,却可能增加很多开发成本。例如:如果你选择的CPU不被vxWorks支持,那么就必须自己开发其CPU支 持代码和BSP(注4)。如果某个以太网芯片没有vxWorks的驱动程序,那么你也不得不开发vxWorks的驱动程序。最让人无法忍受的事情是,现在用过vxWorks的人越来越少,会Linux编程的人越来越多,并且很多人非常熟练。【陈怀临注:非常好的观点。在网络设备中,经典操作系统通常承担基本的功能,而且许多模块有可能被改写,如协议栈,内存管理系统等。也包括调度系统。

如果说IBM选择Linux还带有一定的冒险成分的话,那么现在Cisco、H3C、Huawei等选择Linux,更多是无奈之举。【陈怀临注:也是明智之举。我就不明白某个公司花了好几年的时间还折腾不清楚GPL Lincese的事情。让人哭笑不得。

-------

注1: 当时的Linux已经在互联网行业得到了广泛应用,像FTP、Web这类服务器程序在Linux上运行已经没有任何问题,并且有Sybyse、 Oracle、Infomix等一批商业数据库有Linux版本。有一大批刚刚从学校毕业不久的年轻技术人员熟悉Linux,Linux各种技术资料在互 联网随处可得,讨论Linux论坛网站也层出不穷,Linux在服务器市场的份额快速增长。虽然IBM的AIX在技术上暂时领先(这一点也许有人不同意, 但我认为在2001年左右的时候,Linux在技术上还远远赶不上AIX、Solaris等商业Unix。也许这个问题可以专门作为一个话题展开讨 论。),并且有良好的商业化支持,而且在金融等传统企业市场占有率暂时领先与Linux,但是其活力和前景却远远落后于Linux。对IBM来说,AIX 软件销售并不是其主要收入来源,IBM主要业务是软件服务、服务器硬件的研发和销售。在这种情况下,IBM押宝Linux,不失为明智的选择。当大批信仰 Linux的年轻技术人员逐渐掌握了决策权的时候,他们会在采购中更倾向Linux,这是他们会发现,这些产品中很多都是IBM的。【陈怀临注:在Web 2.0系统中,大量的LINUX做服务器。如经典的LAMP:Linux + Apache + MySQL + PHP.另外,Google就是Linux的集群系统。】

注2:这样说不完全准确,vxWorks在6.x版本中也提供了保护模式的支持,但这个不是vxWorks主要的特性,vxWorks下的大部分应用程序还没有用到这个特性。

注3:可能是基于某个QNX特殊版本的。

注4:有时候甚至这个工作是完全不可行的,某些CPU是跟Linux绑定了的,没有提供完整的寄存器文档。

(4个打分, 平均:4.75 / 5)

雁过留声

“《网络设备操作系统(Linux .vs. vxWorks)》校注”有18个回复

  1. 1help1 于 2008-12-26 12:44 上午

    >【陈怀临注:是的,大量的第三方应用软件,大量的社区人员是Linux生命力和自由软件精神永存的基础。严格来讲,不参考Open Source 源码的工程师不存在。如果有,他要么是什么都不懂,或者其实从来不写程序。】

    陈博士怎么把 future alpha 给忘了。:)

  2. Afei 于 2008-12-29 5:56 上午

    分析的很透彻,非常好。以后多搞些这样子的好东东。

  3. a 于 2009-01-12 1:55 上午

    如果HW/H3 cisco用了linux kernel,如何解决GPL lecense问题?

  4. 陈怀临 于 2009-01-14 8:25 下午

    GPL本身不是问题。如何使用内核里面的符号有一个正确的处理方法。如果GPL这样苛刻,Google岂不是要公布所有的代码?

  5. a 于 2009-01-14 9:22 下午

    请指教,如何规避GPL使我的代码不公开?
    google都用什么GPL代码了?

  6. 陈怀临 于 2009-01-14 9:30 下午

    5,你首先要告诉我你是否编过Linux 2.6以后的LKM没有?否则,先做一个LKM再回来,学习一下如果使用内核的符号表(例如,写一个kernel thread),然后你就知道如何正确的处理GPL的事情了。当然,如果业务比较急,你可以给我发电邮:huailin@tektalk.cn

  7. a 于 2009-01-14 9:38 下午

    不能看到你的符号表在你的binary或内寸中,就能洗清GPL?

  8. 别老拿vxWorks说事 于 2009-01-15 6:23 下午

    Mars Path Finder的Priority Inversion的事故是NASA自己没有处理好信号量的参数,而不是vxWorks本身的问题。vxWorks本身是提供了优先级继承的机制来解决优先级反转的问题。

  9. 中兴之象 于 2009-01-15 6:45 下午

    3楼:
    目前linux kernel是用的GPLv2
    对于LKM,可以不公布源码.
    对于不能做成module的内核代码(比如对进程调度的改进,内存分配的改进),就只能公布代码了.

    Cisco下面的linksys的路由器系列都release GPL code.你可以去下载参考看看,如果你有这方面的法律困惑.那就时常参考看这些大厂的release 方式.FSF最先是找他们的.-).大厂也在”与时俱进”.

    目前FSF的关注焦点在linux kernel的GPL问题.

    对于GPL的应用程序的问题,
    如果不使用GCC编译,就很难抓到直接证据.

    linux kernel因为只能用gcc编译,用反汇编很快能确认.

  10. 中兴之象 于 2009-01-15 6:57 下午

    GPL的”损害”有”受害”主体.按照民法通则,如果某厂商根据GPL的程序”受益”了(获得现金收入),并且某消费者付出了现金购买了某包含GPL的产品.
    在这个时候,GPL的”侵权”行为才成立.
    这也就是目前对于GPL的侵权官司都是针对消费类产品并且都成功的原因.

    对于google.普通用户来说,免费使用,也就没有侵权发生.
    付费google地图用户,如果使用了GPL代码(这个需要用户证明,民法里面,谁主张,谁举证).可以要求GPL地图部分的GPL代码.没有权利要求GPL其他部分代码.

    广告客户,可以通过合同规避掉(要求广告合同客户自己主动放弃这样的权利)

    小弟的观点:从实务上来讲,要起诉google,很困难.所以,目前FSF胜利的官司都是针对消费类产品.

  11. 又在瞎说 于 2009-01-15 7:31 下午

    google的软件是以服务的形式提供的,即SAAS。他对Linux的使用主要是在内部的系统中,譬如googlefs。

    他的软件不进行分发,FSF就拿他没办法。

  12. a 于 2009-01-15 8:29 下午

    9,10
    学习中

  13. 陈怀临 于 2009-01-15 9:03 下午

    8楼,您说的当年的vxwork已经提供了priority inheritance mechanism有出处吗?为什么我的记忆是otherwise?好像解决方式是CMU的几个家伙提供的。

    我没有去查询文献去确认你的观点,纯粹凭记忆发此贴。

    vxworks确实做大系统有问题。天下人都承认。华为用vxworks也没有什么丢人。思科也用呀。

  14. 当然有出处了 于 2009-01-16 12:01 上午

    B core,我是8楼,这篇文章说的很明白了:
    http://zhouxiaohu.blogbus.com/logs/96519.html

  15. 拮据一段 于 2009-01-16 12:04 上午

    为了节省B core的时间(地球人都知道B core很忙),从文中截取关键的一段:
    在VxWorks里,当创建互斥量的时候,有一个bool参数,决定对该互斥量是不是采用优先级继承来防止发生优先级翻转。探路者的程序中创建的总线互斥量正好把这个参数off了。

  16. 黄岩 于 2009-01-16 7:39 上午

    TO 14楼:

    学习了您推荐的这篇文章,很有意思。真是印证了那句话:只要是程序,就会有Bug,改不完的Bug。

    TO 陈先生:
    为什么那么多人喜欢尊敬的叫您B core呢?您的这个头衔有什么典故么?

  17. 陈怀临 于 2009-01-16 7:51 上午

    黄岩,你就喊我陈先生,这样就好。B Core是国内Linux界的一些年轻人都我开玩笑的称呼。这里的读者有一批是Linux界的。

  18. 高飞 于 2009-01-16 3:00 下午

    再多点背景知识。

    优先级翻转: Priority Inversion
    优先级继承: Priority Inheritance
    优先级封顶: Priority Ceiling

    Sha,Rajkumar和Lehoczky在1988年的IEEE RTSS会议上发表论文提出了PIP协议(Priority Inheritance Protocol)来解决优先级翻转的问题。对于实时系统而言,PIP能够限制一个进程最大可能被block的时间——增加了系统的确定性,但是PIP本身不能防止死锁,在实现中需要有死锁解决或者防止机制。(deadlock resolution or deadlock prevention)。

    1990年,对RTSS会议文章的扩展发表于IEEE TC,在这篇文章里,他们提出了PCP(Priority Ceiling Protocol)。通过预先知道一个互斥量的priority ceiling(= the priority of the highest priority job that can lock it),这个协议可以防止死锁。题外话:这些叫做策略(policy)比叫做协议(protocol)更合适,但是88年人家用了协议这个名词,那就尊重历史不改名了。

    这些协议早在上个世纪末就写进real-time systems教科书了,Vxworks的实现也具备这些机制,只是应用有没有打开这个knob。当然,翻翻一下他们的原文也挺好。