如何向 Linux 核心提交驅動
當Linux驅動程式開發到一定階段,向kernel.org提交程式碼是一個很好的選擇。對於很多沒有向上遊提交過程式碼的開發者來說,還是有很多疑問需要解決的。比如,究竟我們向哪裡提交驅動程式?提交時我們的程式碼應該處於什麼狀態?提交的過程又如何呢?
向哪裡提交
Linux staging tree是Greg KH建立的用於提交驅動程式的git倉庫。我們可以把staging tree看作是程式碼進入mainline核心之前的一個預科班,新增的驅動程式首先需要放到這裡供社群review和測試。Staging tree是 Greg KH於2008年建立的一棵kernel tree,其建立之目的是用來放置一些未充分測試或者因為一些其他原因未能進入核心的新增驅動程式和新增檔案系統。
Linux staging tree的URL是” git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6.git “或者” http://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6.git “。這裡需要注意的是,git協議的埠號是9418,因為很多公司的防火牆只會開放80埠,clone程式碼倉庫時如果git協議超時,不妨試試http協議。
關於Linux staging tree更詳細的描述可以參考我前一篇博文《小議Linux staging tree》。
我們的程式碼
在我們向上遊提交驅動程式之前,需要保證程式碼能夠遵循Linux核心的coding style。當然,這個規定並不是強制的,如果您經常閱讀Linux核心程式碼,就會發現很多驅動對核心coding style的遵循情況也並不是太好。但一致的程式碼風格對程式碼的維護大有裨益,所以對作為Linux核心驅動程式設計師的我們來說,遵循coding style是一個很好的習慣。關於Linux核心的coding style的詳細資訊,可以參考Linux核心裡的Documentation/CodingStyle文件,或者我之前的博文《談談為 Linux 核心開發驅動程式碼的編碼風格》。
我們在提交驅動之前還需要用靜態程式碼檢查工具sparse來檢查一下程式碼。
sparse的原始碼可以從“git://git.kernel.org/pub/scm/devel/sparse/sparse.git”獲得,得到程式碼之後,執行”make; make install”來編譯生成可執行程式。預設情況下,sparse程式會被放到目錄“~/bin”下面,如果您不喜歡這個位置,可以修改Makefile來設定路徑。需要注意的是,使用sparse之前,PATH環境變數要設定正確。
sparse的使用方法很簡單,只要在make驅動程式時加上“C=N”的選項即可,其中N的取值是1或者2。當N=1時表示對需要重新編譯的C檔案進行程式碼檢查,N=2時表示對所有的C檔案進行程式碼檢查。
對於staging目錄下的驅動來說,我們還需要附上一個TODO檔案,用來描述未來的維護計劃。一般情況下,TODO檔案可以這樣寫:
TODO: - support more features - use kernel coding style - checkpatch.pl fixes
如何提交
我們可以通過patch的形式把驅動程式提交給staging tree。提交之前,需要首先把staging tree clone到本地,然後基於當前的工作目錄製作patch。
Git提供了製作格式化的patch的功能,命令如下:
git format-patch -N
其中,N是整數,用來指定我們把最近N次提交做成N個patch。比如當N=1時,就表示把最近一次提交製作成patch。Git會根據提交的log資訊來自動命名patch檔案。
這裡需要注意的是,每次提交的log的描述要遵循一定的格式。
Log的第一行是一個簡短的描述。本文主要介紹如何向staging tree提交程式碼,我們需要在Log首行以“staging:”開頭。Log的最後一行需要提供提交者的email資訊,我們可以這樣寫:“Signed-off-by: wwang <wwang@some.site>”。
舉個例子,假定我們的staging driver命名為hello_world,log的格式可以參考如下:
staging: hello_world: My first commit This is my first commit. Signed-off-by: wwang <wwang@some.site>
Patch生成之後,我們需要把它寄給staging tree的維護者,通常是Greg KH本人以及linux核心驅動的開發者列表。這個步驟也可以使用git來幫助我們完成,但首先需要確定系統裡已經安裝msmtp和git-email這兩個包。這裡還需提醒一下,如果您的郵件伺服器是Exchange,很可能需要NTLM認證,這就要求msmtp支援NTLM。Ubuntu倉庫裡的msmtp預設支援NTLM,可以直接使用,但還有些其他的發行版的軟體倉庫裡自帶的msmtp並不支援NTLM(如Arch Linux),這種情況就需要自己編譯了。
msmtp安裝好之後,需要配置”~/.msmtprc”檔案。以Gmail為例,”.msmtprc”可以這樣配置:
# Set default values for all following accounts. defaults logfile ~/.msmtp.log # gmail account gmail protocol smtp host smtp.gmail.com from my@gmail.com user my@gmail.com password mypasswd port 587 auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt syslog LOG_MAIL # Set a default account account default : gmail
用git傳送patch的命令如下:
git send-email / --smtp-server /usr/bin/msmtp / --from my@gmail.com / --to gregkh@suse.de / --to devel@linuxdriverproject.org / --to linux-kernel@vger.kernel.org / ./my.patch
將patch傳送出去只是提交驅動程式的第一步,之後還需要不斷的維護與完善,把程式碼丟給核心然後就放手不管的做法是不可取的。提交程式碼還有一個原則,就是每次提交只做一件事情,這樣才會比較方便核心維護者來review我們的程式碼。
相關文章
- 手把手教你如何向 Linux 核心提交程式碼Linux
- linux核心匯流排驅動模型-驅動篇Linux模型
- 【linux】驅動-2-核心模組Linux
- linux3.4.2核心-LCD驅動程式的移植Linux
- 重磅!英偉達宣佈開源 Linux GPU 核心驅動LinuxGPU
- Linux核心模組驅動載入與dmesg除錯Linux除錯
- Linux 核心驅動中對檔案的讀寫Linux
- 04_Linux下把驅動編譯進核心Linux編譯
- linux核心原始碼閱讀-塊裝置驅動Linux原始碼
- 驅動篇——核心空間與核心模組
- linux驅動之LED驅動Linux
- Linux驅動實踐:帶你一步一步編譯核心驅動程式Linux編譯
- Linux系統核心模組和驅動的編寫(轉)Linux
- Linux驅動實踐:如何編寫【 GPIO 】裝置的驅動程式?Linux
- 核心必須懂(四): 撰寫核心驅動
- Linux驅動模組載入方法和如何判斷Linux驅動是否載入成功Linux
- 在 Mac 上如何向 GitHub 提交程式碼?MacGithub
- RTOS裝置驅動向嵌人式Linux的移植(轉)Linux
- Windows核心驅動-程序回撥Windows
- 在linux(核心2.6.x)下驅動 USB ADSL(轉)Linux
- 如何編寫linux下nandflash驅動-4LinuxNaN
- Linux裝置驅動開發詳解:基於Linux4.0核心Linux
- 向嵌入式Linux移植實時裝置驅動程式(轉)Linux
- 如何編寫一個簡單的Linux驅動(三)——完善裝置驅動Linux
- 領域驅動設計核心概念
- NVIDIA開始開源其Linux核心圖形驅動程式Linux
- Linux核心驅動程式初始化順序的調整(轉)Linux
- 如何推進一個“以行動為導向的”事件驅動架構?事件架構
- 醜聞:明尼蘇達大學研究人員向Linux核心故意提交了有Bug的程式碼Linux
- 學習如何向Linux核心貢獻程式碼,接受Eudyptula挑戰Linux
- xmake v2.6.2 釋出,新增 Linux 核心驅動模組構建支援Linux
- 學Linux驅動: 應該先了解驅動模型Linux模型
- 【linux】驅動-7-平臺裝置驅動Linux
- Linux裝置驅動之字元裝置驅動Linux字元
- 驅動篇——核心程式設計基礎程式設計
- 核心驅動mmap Handler利用技術(一)
- 核心驅動mmap Handler利用技術(二)
- linuxI2C驅動核心梳理Linux