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















 
 
 






 
 
 
 