天天看點

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

繼續閱讀