天天看点

GPL前世今生

从事Linux开发的朋友一定都听过GPL,那么到底什么是GPL呢?他有什么作用呢?本文给大家做详细讲解。

在讲解GPL之前,我们必须先了解什么是GNU?

GNU:GNU's not unix。也叫革奴计划。

GNU的创始人,理查德·马修·斯托曼。

GNU是一个自由的操作系统,其内容软件完全以GPL方式发布。

这个操作系统是GNU计划的主要目标,名称来自GNU's Not Unix!的缩写

【这种递归式命名方法也只有程序猿大神才能想起来】

可以说GNU也是一个软件集合,如:Emas,gcc,bash,gawk等。

由于没有内核(可以理解成还在实验室里就GNU系统就被淘汰了)。

因为GNU的设计类似Unix,但它不包含具著作权的Unix代码。

在二战(1939-1945)结束后,计算机产业刚刚兴起的时候,闭源软件的概念还未出生。那是个一切代码都免费共享,可以随意修改、再发行的时代。

后来,开始有人只发行闭源的程序,这通常是一种原始代码几乎不可能被单纯地破译的二进制文件。1983年,IBM成为大型企业中第一个发行闭源软件的公司;AT&T公司紧随其后,原本免费的Unix在更新后要价数万美元…

平日使用的Unix突然开始收费,还如此昂贵,这让很多人难以接受。

其中,有一个叫Richard Stallman(人称 RMS)的人站出来了。他推出了 GNU计划 ,希望有朝一日,从操作系统到各式应用软件,都能免费开源得让大家使用。

GPL前世今生

而具体的办法,就是在发布软件的同时包括我们今天提到的 GPL 许可证。

GPL前世今生

GPL许可协议(GNU General Public License):

只要软件中包含有其他GPL协议的产品或代码,那么该软件就必须也采用GPL许可协议且开源及免费。

具有以下特点:

复制自由:允许将软件复制到任何人的电脑中,并且不限制复制的数量。

传播自由:允许以各种形式进行传播。

收费传播:允许在各种媒介上出售该软件,但必需提前让买家知道这个软件是可以免费获得的,并解释收费的理由(一般来讲都是能够为用户提供某种服务,以技术服务的形式来收费)。

修改自由:允许开发人员增加或删除软件的功能,但必须依然基于GPL许可协议授权。

总结成一句话,修改后必须以GPL授权开源发布。

只要在代码中加入这个名叫GPL的许可证,你就能保证软件的用户能够自由地运行、研究、分享和修改你的代码了。

而且,从你的软件衍生出的一切修改版本,都必须遵守这个许可协议。

一个有意思的地方是,拥有代码的人有权利用代码开发软件并盈利。

但是,在有人花钱买走软件之后,这个人可以随意把买到的软件分享给其他人,而不必担心侵权,甚至是被告上法庭——因为对于遵守开源协议的软件来说,压根不存在“盗版”的概念。

由此可见,开源协议大大地提高了软件使用者的权利。

理解了GNU的精神,也就能理解GPL在说些什么,其实就是开源。

在现实生活中,我们受益于 GPL的地方,其实很多,几乎所有的操作系统,除了windows,其他的几乎都是基于linux开源代码改写的。

以下是Linux内核中网卡DM9000的驱动程序版权声明:

GPL前世今生

DM9000是Davicom公司生产的一款非常流行的网卡芯片。

第一个红框声明了代码的版权属于作者 Sten Wang 。

第二个红框则是说使用者需要遵守 GPL协议(GNU General Public License)。

Linus Torvalds 认为 GPL 是 Linux 成功的重要部分

GPL前世今生

虽然不是每个开源软件都喜欢 GPL,但是如果没有 GPL ,或许不会有如今的 Linux 和整个开源世界。

以下节选自Linus Torvalds自传《知识为了好玩》

GPL前世今生

后台回复:linus 即可获得这么自传的电子书。

其他开源协议比较

GPL前世今生
GPL前世今生

BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,

需要满足三个条件:

如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。

如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。

不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在

必要的时候可以修改或者二次开发。

GPL前世今生

Apache Licence是著名的非盈利开源组织Apache采用的协议。

该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。

需要满足的条件也和BSD类似:

需要给代码的用户一份Apache Licence,如果你修改了代码,需要在被修改的文件中说明。

在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。

如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。

你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需

要并作为开源或商业产品发布/销售。

GPL前世今生

LGPL是GPL的一个为主要为类库使用设计的开源协议。

和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。

LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。

这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。

但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。

因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品

GPL前世今生

MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他了限制。

也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。

下图是一个完整的Android软件系统所用到的所有协议分布。

GPL前世今生

与Android关系最为密切的主要包括两个方面:驱动和glibc

glibc是linux上的主流的c运行时库,几乎每个linux程序都会简介的依赖c运行时库。

由于glibc是gpl授权的,因此如果采用glibc作为crt,按照前述问题的第二条,这些程序必须开源。

因此安卓采用bionic作为c运行时库替代glibc来规避gpl

再说驱动,Android是基于Linux 内核开发的,Linux内核是GPL授权。

传统的驱动是要作为内核模块被加入到内核中的。

而内核模块属于Linux内核的衍生产品,需要遵守GPL协议开源发布。

Android是由开放手机联盟共同完成的,为了保护联盟中手机生产商的利益,驱动不能被完全开源。

因此安卓引入HAL,给linux内核开了个后门,增加了一些系统调用。

HAL在内核的部分按照GPL的要求开源。

驱动开发者可以在用户态使用这些新增的系统调用完成驱动的开发。从而在驱动方面规避了GPL。

进一步了解:

Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。 也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space), 其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗? 从技术实现的角度来看,是可以的,然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间,可能会损害厂家的利益。 我们知道,Linux内核源代码版权遵循GNU License,而Android源代码版权遵循Apache License,前者在发布产品时,必须公布源代码,而后者无须发布源代码。如果把对硬件支持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,而公开源代码就意味着把硬件的相关参数和实现都公开了,在手机市场竞争激烈的今天,这对厂家来说,损害是非常大的。 因此,Android才会想到把对硬件的支持分成硬件抽象层和内核驱动层,内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。 也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。大家想想,Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了,这也是为什么说Android是开放系统而不是开源系统的原因。

copyright就是俗称的版权,也叫著作权。

版权又称著作权,用来表述创作者因其文学和艺术作品而享有的权利。版权的取得有两种方式:自动取得和登记取得。在中国,按照著作权法规定,作品完成就自动有版权(百度百科)。

简单来说,版权(copyright)只是规定是谁对作品享有权利,而具体享有哪些权力,需要参照当地法律。

比如一种定义是:

根据规定,作者享受下列权利:

以本名、化名或以不署名的方式发表作品;

保护作品的完整性;

修改已经发表的作品;

因观点改变或其他正当理由声明收回已经发表的作品,但应适当赔偿出版单位损失;

通过合法途径,以出版、复制、播放、表演、展览、摄制片、翻译或改编等形式使用作品;

因他人使用作品而获得经济报酬。上述权利受到侵犯,作者或其他版权所有者有权要求停止侵权行为和赔偿损失。

GPL前世今生

在此基础上,作者还可以制定授权协议(license),来具体地界定使用者的权利。

也就是说,

比如,商业化的授权协议(license)可能会倾向于强调,使用者的哪些行为是侵权行为,从而保护自己的商业利益。

GPL前世今生

而与这一商业化的授权风格相对的是,RMS等人引领的copyleft的思潮。这一思想在保护作者的基本版权之余, 可以让作者通过在作品中添加开源协议(license),从而放大用户的权力。

比如我们今天的主角,RMS在198为GNU项目拟定的 GLP 协议,允许用户自由地运行、研究、分享和修改源代码。

欢迎关注公众号:一口Linux

继续阅读