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