你試過本身寫內核補丁嗎?本節介紹在把你的補丁包提交到 Linux 郵箱列表以前,須要作哪些操做。另外咱們還會介紹如何把它發送出去。php
寫好代碼後,編譯它。把 make 過程產生的輸出保存到文檔中,查看新代碼有沒有警告信息。找到全部的警告信息,處理掉。當你的代碼編譯過程沒有任何不正常的輸出,安裝這個內核,而後啓動 測試。若是啓動正常,查看 dmesg 裏面有沒於錯誤,與老內核生成的 dmesg 日誌作個比較。運行一些壓力測試,請參考咱們之前講過的測試內容。若是這個補丁用於修復某個 bug,請確保真的已經修復了。若是真的修復了,請確保能經過系統測試。找出打你補丁的模塊下面的迴歸測試工具,運行一下。若是補丁涉及到其餘架構,你需 要交叉編譯而後測試一下。請經過下面的目錄查找測試工具:html
linux_git/Documentationlinux
linux_git/tools/testinggit
交叉編譯參考:在 x86_64 架構上交叉編譯 Linux 內核:初學者教程github
若是你對你的補丁測試結果感到很滿意,你就能夠提交補丁了。請確保提交 commit 的信息要描述得很是清楚。要讓內核維護者和其餘開發者看懂補丁所修改的內容,這一點很是重要。生成補丁後,執行 scripts/checkpatch.pl 腳本,找到 checkpatch 是產生的錯誤或警告(若是有的話),修復它們。從新生成補丁,直到補丁經過這個腳本的測試。從新測試這個補丁。將本補丁用於其餘的內核源碼上,保證不會有 衝突產生。api
如今你作好提交補丁的準備了。先運行 scriptst/get_maintainer.pl 來確認你應該把補丁發給哪一個內核維護者。注意不要以附件形式發送補丁,而是以純文本形式粘貼在郵件裏面。確保你的郵件客戶端能夠發送純文本信息,你能夠試 試給本身發送一份補丁郵件來測試你的郵件客戶端的功能。收到本身的郵件後,運行 checkpatch 命令並給本身的內核源碼打上你的補丁。若是這兩部都能經過,你就能夠給 Linux 郵箱列表發送補丁了。使用 git send-email 命令是提交補丁最安全的方式,能夠避免你的郵箱的兼容性問題。你的 .gitconfig 文件裏面須要配置好有效的 smtp 服務器,詳細操做參考 git 的幫助文檔。安全
更多提交補丁的規矩,請參考下面的資料:服務器
linux_git/Documentation/applying-patches.txt架構
linux_git/Documentation/SubmitChecklistapp
linux_git/Documentation/SubmittingDrivers
linux_git/Documentation/SubmittingPatches
linuxgit/Documentation/stablekernel_rules.txt
linuxgit/Documentation/stableapi_nonsense.txt
下面是一些內核測試教程的資料:
除咱們討論過的測試資源以外,這裏還有不少測試項目值得介紹,包括開源的和廠家本身提供的。這些項目每個都是針對特定領域的,好比嵌入式或者企業本身使用。咱們簡單過一下。
Linux 測試項目(LTP)測試套件是一系列工具的集合,用於測試內核的可靠性、健壯性和穩定性。你能夠爲這個項目添加本身的測試代碼,而且 LTP 項目歡迎你貢獻本身的代碼。runltp 腳本默認狀況下會測試下面的子系統:
文件系統壓力測試
磁盤 IO 測試
內存管理壓力測試
IPC(進程間通訊)測試
調度器測試
命令的功能性驗證測試
系統調用功能驗證測試
LTP-DDT 是一個基於 LTP 的測試應用(LCTT:就是 LTP 的閹割版麼),專一於測試嵌入式設備驅動。
Linux Driver Verification 這個項目的目標是提升 Linux 設備驅動的質量,它爲設備驅動驗證開發了集成環境平臺,而且利用與時俱進的研究來加強驗證工具的質量。
若是你有將某個 Unix 平臺下的應用一直到另外一個平臺的經驗,你就能理解 Linux Standard Base (LSB) 和 LSB 一致性測試套件的重要性了。LSB 是 Linux Foundation 工做組建立的用於下降支持不一樣 Linux 平臺所須要的開銷,方法就是經過下降不一樣 Linux 發行版之間的差異,保證應用在不一樣發行版之間的可移植性。前事不忘後事之師,Unix 世界的分歧在 Linux 世界必定要避免。這就是爲何你能夠把一個 rpm 包轉化成 deb 包後還能安裝並正常運行的祕密。
靜態分析之因此會被稱爲「靜態分析」,是由於這些工具只分析代碼,並不執行它們。分析 Linux 內核代碼的靜態分析工具備不少,Sparse 是 Linus Torvalds 寫的專門用於檢查內核靜態類型的工具。它是一個語義檢查器,會爲 C 語言的語義創建語義檢析樹,執行惰性類型評估。內核編譯系統支持 sparse,而且爲編譯內核的命令提供開啓 sparse 的選項。
爲內核全部須要從新編譯的 C 文件執行 sparse 語義檢查:
make C=1 allmodconfig
爲內核全部 C 文件(即便不須要從新編譯)執行 sparse 語義檢查:
make C=2 allmodconfig
Sparse 的資源:
Smatch 分析程序代碼的邏輯錯誤。它能夠檢測到諸如「爲一個沒鎖上的 spinlock 執行解鎖」的邏輯錯誤。內核源碼支持 smatch:
在 Linux 內核中運行 smatch:
make CHECK="~/path/to/smatch/smatch -p=kernel" C=1 bzImage modules | tee warns.txt
請參考下面的資料來獲取和編譯 smatch。須要注意的是 smatch 是個正在發展的項目,架構會不斷變化。
那麼咱們該怎麼處理 Sparse 和 Smatch 所發現的語義和邏輯上的錯誤呢?一些錯誤能夠被分離爲平常問題或模塊問題,能夠輕易被解決。可是有些語義錯誤涉及到全局,由於剪切粘貼了一些代碼。在一些 環境中,當一些接口函數被廢棄再也不使用,或者僅僅作了寫微小的修改,你就須要大規模更新源碼。這時候你須要 Coccinelle 來幫忙。,Coccinelle 使用 SmPL 語言(語義包語言)來爲 C 代碼提供匹配和轉換代碼的功能。Coccinelle 的從一開始就做爲 Linux 的附屬產品持續發展的。
舉個例子:foo(int) 函數忽然變成 foo(int, char *) 函數,多出了一個輸入參數(能夠把第二個參數置爲 null)。全部調用 foo() 函數的代碼都須要更新了,這多是個悲摧的體力活。可是使用 Coccinelle 的話,這項工做瞬間變得輕鬆,腳本會幫你找到調用 foo(parameter1) 的代碼,而後替換成 foo(parameter1, NULL)。作完這些後,全部調用這個函數的代碼均可以運行一遍,驗證下第二個參數爲 NULL 是否能正常工做。關於 Coccinelle 的更多信息,以及在不一樣項目中(固然,也包括 Linux 內核這個項目)的使用方法,請參考項目主頁:Cocinelle。
本文涵蓋了不少方面,這裏列出一些參考文檔供讀者作進一步研究。
感謝來自 Oracle 的 Khalid Aziz,審查校對並提供許多很是有價值的建議。感謝來自三星的 Mauro Chehab 和 Guy Martin,他們給了我屢次反饋。感謝來自 Linux Foundation 的 Grey Kroah-Hartman 對本文的審閱。感謝來自三星的 Ibrahim Haddad,沒有他的支持和鼓勵,我可能還不會坐下來寫出這篇文章。
做者:Shuah Khan
Shuah Khan 是三星公司開源組的高級 Linux 內核開發工程師。 她爲 Linux 內核中的 IOMMU、DMA、電源管理、PCIe 貢獻代碼,同時維護內核,爲內核提供補丁包。Shuah 有多年 Unix 內核開發經驗。她也爲 OpenHPI 和 LLDP 項目做貢獻。
via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,5
來源: linuxjournal
原文: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,5
譯者: bazz2
本文是原創投遞或翻譯投遞,Linux中國首發地址:http://linux.cn/article-3684-1.html
歡迎轉載,敬請在正文中標註並保留原文/譯文連接和做者/譯者等信息