一、GNU/GPL
在讲解GPL之前,我们必须先了解什么是GNU?
1. 什么是GNU
GNU:GNU’s not unix。也叫革奴计划。
GNU的创始人,理查德·马修·斯托曼。
GNU是一个自由的操作系统,其内容软件完全以GPL方式发布。
这个操作系统是GNU计划的主要目标,名称来自**GNU’s Not Unix!**的缩写 【这种递归式命名方法也只有程序猿大神才能想起来】
可以说GNU也是一个软件集合,如:Emas,gcc,bash,gawk等。
由于没有内核(可以理解成还在实验室里就GNU系统就被淘汰了)。
因为GNU的设计类似Unix,但它不包含具著作权的Unix代码。
2. GNU历史
在二战(1939-1945)结束后,计算机产业刚刚兴起的时候,闭源软件的概念还未出生。那是个一切代码都免费共享,可以随意修改、再发行的时代。
后来,开始有人只发行闭源的程序,这通常是一种原始代码几乎不可能被单纯地破译的二进制文件。1983年,IBM成为大型企业中第一个发行闭源软件的公司;AT&T公司紧随其后,原本免费的Unix在更新后要价数万美元…
平日使用的Unix突然开始收费,还如此昂贵,这让很多人难以接受。
其中,有一个叫Richard Stallman(人称 RMS)的人站出来了。他推出了 GNU计划 ,希望有朝一日,从操作系统到各式应用软件,都能免费开源得让大家使用。
而具体的办法,就是在发布软件的同时包括我们今天提到的 GPL 许可证。
3. 什么是GPL
GPL许可协议(GNU General Public License): 只要软件中包含有其他GPL协议的产品或代码,那么该软件就必须也采用GPL许可协议且开源及免费。
具有以下特点:
4. 通俗的讲下GPL到底有什么作用?
总结成一句话,修改后必须以GPL授权开源发布。
只要在代码中加入这个名叫GPL的许可证,你就能保证软件的用户能够自由地运行、研究、分享和修改你的代码了。
而且,从你的软件衍生出的一切修改版本,都必须遵守这个许可协议。
一个有意思的地方是,拥有代码的人有权利用代码开发软件并盈利。
但是,在有人花钱买走软件之后,这个人可以随意把买到的软件分享给其他人,而不必担心侵权,甚至是被告上法庭——因为对于遵守开源协议的软件来说,压根不存在“盗版”的概念。
由此可见,开源协议大大地提高了软件使用者的权利。
理解了GNU的精神,也就能理解GPL在说些什么,其实就是开源。
在现实生活中,我们受益于 GPL的地方,其实很多,几乎所有的操作系统,除了windows,其他的几乎都是基于linux开源代码改写的。
5. 举例
以下是Linux内核中 卡DM9000的驱动程序版权声明:
DM9000是Davicom公司生产的一款非常流行的 卡芯片。
二、GPL与Linux
Linus Torvalds 认为 GPL 是 Linux 成功的重要部分
虽然不是每个开源软件都喜欢 GPL,但是如果没有 GPL ,或许不会有如今的 Linux 和整个开源世界。
以下节选自Linus Torvalds自传《知识为了好玩》
后台回复:linus 即可获得这么自传的电子书。
其他开源协议比较
1. BSD开源协议(original BSD license、FreeBSD license、Original BSD license)
BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。
需要满足三个条件:
- 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
- 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
2. Apache(Apache License, Version 2.0、Apache License, Version1.1、Apache License, Version 1.0)
Apache Licence是著名的非盈利开源组织Apache采用的协议。
需要满足的条件也和BSD类似:
- 需要给代码的用户一份Apache Licence,如果你修改了代码,需要在被修改的文件中说明。
- 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。
你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。
Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需 要并作为开源或商业产品发布/销售。
3. LGPL(GNU Lesser General Public License)
LGPL是GPL的一个为主要为类库使用设计的开源协议。
和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。
LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。
这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。
但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。
因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。
4. MIT(MIT)
也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。
四、 大名鼎鼎Android内核是Linux,那他是如何规避GPL的
下图是一个完整的Android软件系统所用到的所有协议分布。
与Android关系最为密切的主要包括两个方面:驱动和glibc
1. glibc
glibc是linux上的主流的c运行时库,几乎每个linux程序都会简介的依赖c运行时库。
由于glibc是gpl授权的,因此如果采用glibc作为crt,按照前述问题的第二条,这些程序必须开源。
因此安卓采用bionic作为c运行时库替代glibc来规避gpl
2. 驱动
再说驱动,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是开放系统而不是开源系统的原因。
五、软件其他几个相关的版权概念
1. copyright
copyright就是俗称的版权,也叫著作权。
简单来说,版权(copyright)只是规定是谁对作品享有权利,而具体享有哪些权力,需要参照当地法律。
比如一种定义是:
- 以本名、化名或以不署名的方式发表作品;
- 保护作品的完整性;
- 修改已经发表的作品;
- 因观点改变或其他正当理由声明收回已经发表的作品,但应适当赔偿出版单位损失;
- 通过合法途径,以出版、复制、播放、表演、展览、摄制片、翻译或改编等形式使用作品;
2. license
也就是说,
即
权利 = 版权(copyright) + 授权协议(license)
比如,商业化的授权协议(license)可能会倾向于强调,使用者的哪些行为是侵权行为,从而保护自己的商业利益。
3. copyleft
比如我们今天的主角,RMS在198为GNU项目拟定的 GLP 协议,允许用户自由地运行、研究、分享和修改源代码。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!