如何成為一個(gè)Linux系統(tǒng)內(nèi)核開發(fā)者
你想成知道如何成為一個(gè)Linux內(nèi)核開發(fā)者么?或者你的老板告訴你,“去為這個(gè)設(shè)備寫一個(gè)Linux驅(qū)動(dòng)?!斑@篇文檔的目的,就是通過描述你需要經(jīng)歷的過程和提示你如何和社區(qū)一起工作,來教給你為達(dá)到這些目的所需要知道的所有知識(shí)。本文也嘗試解釋社區(qū)為什么這樣工作的一些原因。
內(nèi)核幾乎全是用C寫成的,有一些架構(gòu)相關(guān)的部分是用匯編語言寫成的。熟練掌握C語言是內(nèi)核開發(fā)的必備條件。匯編語言(任何架構(gòu))的了解不是必須的,除非你準(zhǔn)備做某個(gè)架構(gòu)的底層開發(fā)。雖然下面這些書不能完全代替扎實(shí)的C語言教學(xué)和/或者成年累月的經(jīng)驗(yàn),他們還是不錯(cuò)的參考,如果用得著的話: - "The C Programming Language" 作者: Kernighan and Ritchie [Prentice Hall]- "Practical C Programming" 作者: Steve Oualline [O'Reilly]
內(nèi)核是用 GNU C 和 GNU 工具鏈寫成的。雖然它符合 ISO C89 標(biāo)準(zhǔn),它還是使用了一些標(biāo)準(zhǔn)中沒有的擴(kuò)展。內(nèi)核是自成體系的 C 環(huán)境,它并不依賴標(biāo)準(zhǔn)C庫,所以某些C語言標(biāo)準(zhǔn)是不支持的。任意長度long long類型除法和浮點(diǎn)數(shù)是不被允許的。有時(shí)候會(huì)很難理解內(nèi)核對(duì)于它所使用的工具鏈和擴(kuò)展的假定,而且不幸的是也沒有關(guān)于它們的絕對(duì)的參考。請查閱gcc 的info頁(`info gcc`)以獲取有關(guān)信息。
請記住你是在嘗試學(xué)習(xí)如何與已經(jīng)存在的開發(fā)社區(qū)一起工作。這是一群成分復(fù)雜的人們,他們對(duì)于代碼,風(fēng)格和步驟有高的標(biāo)準(zhǔn)。這些標(biāo)準(zhǔn)是經(jīng)過時(shí)間檢驗(yàn)的。
他們發(fā)現(xiàn)遵循這些標(biāo)準(zhǔn)對(duì)于這樣一個(gè)大規(guī)模的且地理上分散的團(tuán)隊(duì)是最佳的選擇。嘗試提前學(xué)習(xí)盡可能多的有關(guān)這些標(biāo)準(zhǔn)的知識(shí),因?yàn)樗鼈兌加泻芎玫奈臋n;不要期望別人會(huì)遵照你或者你公司的行事方式。
法律問題
Linux內(nèi)核源代碼依照GPL發(fā)布。請參考源代碼樹下的COPYING文件,以獲取有關(guān)這個(gè)許可證的詳細(xì)信息。如果你對(duì)這個(gè)許可證有疑問,請聯(lián)系你的律師,不要在Linux內(nèi)核郵件列表里詢問。郵件列表里的人們不是律師,你不應(yīng)該依賴于他們對(duì)于法律問題的解釋。
文檔
Linux內(nèi)核源代碼樹有很多文檔,它們對(duì)于學(xué)習(xí)如何與內(nèi)核社區(qū)交流來說有不可估量的價(jià)值。當(dāng)新的功能加進(jìn)內(nèi)核的時(shí)候,通常建議作者把解釋這個(gè)新功能的文檔也加進(jìn)內(nèi)核。如果一個(gè)內(nèi)核變動(dòng)導(dǎo)致了內(nèi)核對(duì)用戶空間界面的改變,建議你把這個(gè)信息或者一個(gè)解釋了這個(gè)變動(dòng)的manpage的補(bǔ)丁發(fā)送給手冊頁的維護(hù)者 mtk-manpages@gmx.net。
這里有一個(gè)內(nèi)核源代碼樹里需要閱讀的文件列表:
README
這個(gè)文件簡單介紹了Linux內(nèi)核的背景,并描述了配置和編譯內(nèi)核需要做哪些事情。內(nèi)核新手應(yīng)該從這里開始。
Do*****entation/Changes
這個(gè)文件介紹了成功編譯和運(yùn)行內(nèi)核所需要各種不同軟件的列表。
Do*****entation/CodingStyle
這個(gè)文件描述了Linux內(nèi)核代碼風(fēng)格,還有背后的一些原因。所有的新代碼的要符合這個(gè)文檔里的準(zhǔn)則。大多數(shù)維護(hù)者只會(huì)接受符合這些規(guī)則的補(bǔ)丁,很多人只看符合正確風(fēng)格的代碼。
Do*****entation/SubmittingPatches
Do*****entation/SubmittingDrivers
#p#這些文件非常詳細(xì)的介紹了如何成功的創(chuàng)建和發(fā)送一個(gè)補(bǔ)丁,包括(但不限于):
-Email內(nèi)容
-Email格式
-發(fā)送給誰
遵守所有這些規(guī)則并不能保證成功(對(duì)所有的補(bǔ)丁都需要進(jìn)行內(nèi)容和風(fēng)格的詳細(xì)檢查),但是不遵守這些規(guī)則就一定不會(huì)成功。
其他關(guān)于如何創(chuàng)建補(bǔ)丁的很好的文章有:
“The Perfect Patch"
linux/patches/stuff/tpp.txt">www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
"Linux kernle patch submission format"
linux.yyz.us/patch-format.html
Do*****entation/stable_api_nonsense.txt
這個(gè)文件解釋了有意識(shí)的決定-不在內(nèi)核里使用穩(wěn)定的API-的原因,包括:
-子系統(tǒng)分隔層(為了兼容?)
-操作系統(tǒng)之間的驅(qū)動(dòng)可移植性
-緩和(或者阻止)內(nèi)核源代碼樹的急速變動(dòng)
這個(gè)文檔對(duì)于了解Linux的開發(fā)哲學(xué)是非常關(guān)鍵的,對(duì)于由開發(fā)其他操作系統(tǒng)轉(zhuǎn)而開發(fā)Linux人也是很重要的。
Do*****entation/SecurityBugs
如果你感覺到你發(fā)現(xiàn)了Linux內(nèi)核里的一個(gè)安全問題,請遵照這個(gè)文檔里所描述的步驟來提醒內(nèi)核開發(fā)者,并幫助解決問題。
Do*****entation/ManagementStyle
這個(gè)文檔描述了Linux內(nèi)核維護(hù)者如何運(yùn)作,以及他們?yōu)槭裁催@樣做。它對(duì)于任何內(nèi)核開發(fā)新手(或者任何對(duì)本話題感興趣的人)來說是非常重要的。
因?yàn)樗忉屃艘恍T有的錯(cuò)誤概念,可解決有關(guān)內(nèi)核維護(hù)者獨(dú)特行為的疑惑。
Do*****entation/stable_kernel_rules.txt
本文件描述了穩(wěn)定版本內(nèi)核釋出的規(guī)則,還有如果你想對(duì)其中的一個(gè)版本做一些改動(dòng)應(yīng)該做些什么。
Do*****entation/kernel-docs.txt
一個(gè)有關(guān)內(nèi)核開發(fā)的外部文檔的列表。如果你在內(nèi)核內(nèi)部文檔里沒有找到? 要找的東西,你可以參考這個(gè)列表。
Do*****entation/applying-patches.txt
介紹了對(duì)于什么是補(bǔ)丁,以及如何應(yīng)用補(bǔ)丁于不同的內(nèi)核開發(fā)分支。
內(nèi)核也有很多可以從源代碼自動(dòng)產(chǎn)生的文檔。這包括內(nèi)核內(nèi)部API的全面描述,有關(guān)如何處理好鎖定的規(guī)則。這些文檔會(huì)被創(chuàng)建于 Do*****entation/DocBook/文件夾中。在內(nèi)核主源碼樹中通過運(yùn)行下面的命令可以創(chuàng)建出PDF,Postscript, HTML 和manpage等不同格式的文檔: make pdfdocsmake psdocsmake htmldocsmake mandocs
成為一個(gè)內(nèi)核開發(fā)者
如果你對(duì)Linux內(nèi)核開發(fā)一無所知,你可以看看Linux KernelNewbies項(xiàng)目:
kernelnewbies.org
它包含一個(gè)郵件列表,在那里你可以問任何有關(guān)內(nèi)核開發(fā)的基礎(chǔ)問題(在問問題之前先搜索一下存檔,很可能這個(gè)問題已經(jīng)被解答過了。)它還有一個(gè)IRC頻道,你可以在里面實(shí)時(shí)的提問。它還有很多有用的文檔,對(duì)于學(xué)習(xí)Linux內(nèi)核開發(fā)很有用。
這個(gè)網(wǎng)站有有關(guān)代碼組織,子系統(tǒng),當(dāng)前項(xiàng)目(代碼樹之內(nèi)的和之外的)的基本信息。它也描述了一些基本的“物流”信息,比如怎么樣編譯內(nèi)核和怎么樣打補(bǔ)丁。
如果你不知道從何處起步,但是你想找一些任務(wù)來做以加入內(nèi)核開發(fā)社區(qū),請看一下Linux Kernel Janitor項(xiàng)目:
janitor.kernelnewbies.org/
這是一個(gè)很好的起步的地方。它描述了一些相對(duì)來說簡單的內(nèi)核中需要清理的和解決的問題。和負(fù)責(zé)這個(gè)項(xiàng)目的開發(fā)者一起工作,你會(huì)學(xué)到如何令你的補(bǔ)丁進(jìn)入Linux內(nèi)核樹的基本知識(shí),而且可能會(huì)為你指明下一步的發(fā)展方向,如果你自己尚不明確的話。
如果你已經(jīng)有了一段代碼想要放到內(nèi)核樹里,但是需要某種形式的幫助,那么kernel-mentors項(xiàng)目就可以幫你的忙了。這是一個(gè)郵件列表,可以在下面找到:
selenic.com/mailman/listinfo/kernel-mentors
在你對(duì)Linux內(nèi)核代碼作任何實(shí)際的改動(dòng)之前,必須要了解相關(guān)的代碼是如何工作的。為了達(dá)到這個(gè)目的,沒有比直接讀它(很多困難的地方都有很好的注釋)更好的方法了,甚至可能是在某個(gè)特殊工具的幫助下來閱讀。很值得推薦的這樣一種工具是Linux Cross-Reference項(xiàng)目,它可以把源代碼以一種自我引用的、索引的網(wǎng)頁形式顯示出來。一個(gè)非常好的最新的內(nèi)核代碼倉庫可以在這里找到: //sosdg.org/~coywolf/lxr
所有這些事情有時(shí)候很難做到。要想完美做到這些要求可能需要幾年的時(shí)間。這是一個(gè)持續(xù)的發(fā)展過程,需要很多耐心和決心。但是不要放棄,這是可以實(shí)現(xiàn)的。很多人已經(jīng)做到了這一點(diǎn),每個(gè)人都經(jīng)歷過你現(xiàn)在這個(gè)階段。
【編輯推薦】