【 以下文字转载自 LinuxDev 讨论区 】
发信人: dahuang (Straightman), 信区: LinuxDev
标 题: 张乐:龙芯对自由软件的理解不够深入
发信站: 水木社区 (Sun Jul 5 22:05:16 2009), 站内
http://www.testlab.com.cn/html/qiyejisuan/20090702/1293.html
导语
上期我们刊发了有关中科院计算所获得MIPS架构授权的评论,在肯定其产业化进展的同时,也提到基础软件部分逐渐成为新的瓶颈。本次我们特别邀请了长期奋斗在龙芯与自由软件领域一线的专家撰文进行点评,深入剖析目前这方面存在的种种问题。
作者简介
张乐(http://zhangle.is-a-geek.org)
Gentoo Linux开发者暨中文社区负责人,Gentoo龙芯版维护者,2009 Google SoC Debian MIPS N32 Port项目导师,资深自由软件贡献者。曾为计算机世界实验室《龙芯2F处理器GCC 4.4优化探秘》一文撰写点评,并在测试中提供了全程支持。
最近,有关龙芯“自主CPU战略失败”的争论掀起了很大的波澜。虽然这方面问题已得到澄清,但龙芯真正面临的问题其实还有很多。在这篇文章里,笔者针对龙芯与自由软件这个话题,结合近两年来参与项目的经验,阐述一些个人见解,希望能够唤醒龙芯团队与公众对此的关注。
自诞生之日起,龙芯就与以Linux为代表的自由软件之间存在着千丝万缕的联系。并且由于商务、产业环境等方面的原因,现阶段龙芯可谓是相当倚重自由软 件。但这并不是一件坏事,相反的,长远来看这是一件天大的好事。作为一个自由软件行业的长期从业者,笔者坚信未来自由软件将成为主流,龙芯只不过是顺应潮 流而已。
虽然自由软件经过20年左右的发展,已取得长足进步,但从市场占有率来看,还并不普及。尤其在以桌面应用为代表的领域,用 户的使用习惯甚至成为超越软件功能的决定性因素。而在一些特殊的市场,自由软件已经打开了突破口,手机上的Android、上网本及MID领域的 Moblin都是成功案例。所以,龙芯应该继续坚持自由软件这条道路,义无反顾地走下去,前途必将是无限光明。这一点,相信龙芯的开发团队、下游厂商和爱 好者们都看得很清楚。
再来看看龙芯平台上自由软件的发展现状。Linux本身支持MIPS,理论上可以运行在龙芯上,但这其中还需 要做很多工作。首先,要保证软件可以运行。和x86平台上可以自行DIY不同,基于MIPS平台的产品一般都是特殊订制的,Linux内核为每种MIPS 机器都设定了一套独立的配置选项。再加上龙芯和其他MIPS实现还有一些细微的差别,龙芯电脑上有一些硬件的驱动也尚未进入Linux内核,所以未经修改 的内核在龙芯平台上是不能运行的。目前,这个问题已基本得到解决,但要彻底根治,还要等Linux/MIPS项目正式收录龙芯2F平台的内核补丁才行。
其次,软件能否良好高效地运行?这个问题牵扯到许多层面,解决起来复杂的多。在底层,由于龙芯2号处理器实现了完整的MIPS III指令集,工具链(gcc/binutils)不经修改也是可以使用的。并且目前已发布的gcc 4.4和binutils 2.19已经支持龙芯2E和2F,可以生成龙芯特有的指令。然而,系统底层函数库glibc还缺少专门针对龙芯的优化,并且截至目前貌似还没有人着手进 行。类似的,系统里所有多媒体相关的库和应用程序都可以做一些针对龙芯特殊指令的优化,但目前也尚未有人统计过有哪些需要优化,哪些已经做过优化。据笔者 了解,中科龙梦现在有一个mplayer(Linux下使用最广泛的媒体播放器)的优化项目,只是其优化的形式值得商榷,具体细节下面还会详细探讨。
除了工具链、函数库和应用程序,ABI的选择也是对性能影响较大的一个方面。在龙芯乃至整个MIPS世界里,使用最多的是O32的系统,它的效率明显落 后于采用N32 ABI的系统。经过测试,至少从目前来看,N32 ABI在非科学计算领域应该是最好的选择。但由于用户群体相对较少,现有N32系统在龙芯上存在着一些问题。笔者从去年年底开始这方面的探索,有若干补丁 被Linux内核/glibc/gcc等项目收录,并制作了一个采用N32 ABI的Gentoo Linux。经过一段时间的排错,这个系统在龙芯平台上已经可以投入实用。由O32向N32迁移是MIPS平台上系统的必然发展趋势,前段时间,今年 Google Summer of Code指导机构之一的Debian还成立了一个MIPS N32移植项目,该项目的完成将会对N32系统的普及起到巨大的推动作用。
总体上看,龙芯上自由软件的发展现状处于由可用到好用的过渡阶段,成果与不足并存。笔者认为,目前龙芯软件开发的最大问题是龙芯对自由软件的理解不够深入,具体表现为开发中某些做法与自由软件社区中约定俗成的做法有些不同。
首先,常见的自由软件发展形式中发展的主体是软件项目,推动项目发展的是围绕这个项目成立的社区。公司只作为软件项目的一个贡献者,是社区成员的角色, 这方面最好的代表就是Linux内核。有的项目背后虽然只由一个公司所掌控,也得采用这种形式,比如Ubuntu。这样做的好处是可以淡化公司的存在,让 人们相信自己是为了这个软件项目在做贡献,尽可能多地吸引不同背景的开发者。而目前实际上并没有这样的一个关于龙芯的社区存在。如果有这样一个社区的话, 我们应该尽快为龙芯软件的发展确定一个路线图,确立统一的规划,加强社区各个成员间的合作与共享。比如搞清楚发展的先后顺序,搞清楚每个成员正在做的事 情,搞清楚每个具体项目的进度,搞清楚还有哪些工作需要完成等等。这样,假如有其他人想加入的话,也可以知道自己应该从哪里下手,有利于吸引更多的开发 者。建立Planet(开发者的blog聚合)也很有必要,可以让所有人随时了解每个开发者已经做了什么,正在做着什么。
其次,在 研发软件之前,应该对现存的自由软件项目做充分的调研,看看有哪些项目可以利用(龙芯选择Linux其实也是不自觉的经历了这个步骤)。并非只有操作系统 才值得这样做,桌面环境、应用软件一样可以。逸珑8089笔记本自带系统的桌面是经过修改的KDE,这个项目笔者认为很难有什么前途,因为决定自由软件发 展的一个重要因素是使用人数,用的人多了,才会吸引更多的贡献者。如果在决策之初稍作调研的话,也许会发现海峡对岸的开发者正在打造一个叫做LXDE的轻 量级桌面环境。这个桌面环境运行起来可以显示出与华硕EeePC几乎一样的操作界面,与逸珑8089笔记本自带系统的界面也很相似。LXDE遵循 freedesktop.org组织提出的自由桌面标准开发,如果当初在此基础上进行二次开发,会省不少力气,还能创造双赢的局面。
第三,龙芯相对欠缺与国际自由软件社区主动交流的意识和行动。自由软件的一个好处是谁都可以得到源代码来学习和改进。但改进只有被上游所收录之后才能真 正地存活下去。例如逸珑8089笔记本的温度与风扇监控模块在最新版本的Linux内核上工作不正常,我们只有自己去做相应的修改。如果模块进入了内核, 我们就不用做这个事情,当初引入这个改动的人会负责把内核中所有需要改动的地方进行修改。
想让上游收录我们的补丁,在写补丁之前就 应该了解上游对于代码的要求,比如最起码的代码风格等。在写的过程中,也应该多多听取上游对于代码的意见。可惜龙芯目前在这方面做的还不够好。以前文提到 的mplayer为例,简单看一下这个专门为龙芯优化的mplayer的源代码,可以发现几乎所有的改动都是把原有代码注释掉,再加上手工编写的汇编语 言。这样的改动,让任何人都没有协作的余地,也会给维护带来很大麻烦(汇编语言难以理解且与ABI相关),是绝对没有可能进入上游的。如果要用龙芯的多媒 体指令集,可以利用gcc 4.4版本开始提供的龙芯多媒体指令intrinsic。最起码,可以为每一个指令定义一个宏,而不要直接使用大段的汇编语言。
要解决所有这些问题,最根本的还是要重视软件在龙芯生态环境中的作用,不要视其为附庸。软件社区的建设与人才培养是当务之急,要知道在许多大型IT企业中, 软、硬件工程师的比率甚至超过2:1。另一方面,目前龙芯阵营中,还缺少在国际开源社区举足轻重的人物,如果完全靠自己培养,将会比较耗时。收买有时也是 很有效的运作方式,就像英特尔雇佣Xorg的老大Keith Packard,对龙芯就是很好的启发。笔者认为,只有当我们的软件工程师可以代表龙芯在一些著名的自由软件国际会议上发表主题演讲的时候,才意味着龙芯 产业生态环境达到了健全的程度。