為 Linux 內核創(chuàng)建測試用例相當簡單;通常要么要求特定的范圍,要么要求廣泛的范圍。不過,當在用戶空間進行測試時,有一些特殊情況可能很難測試。很少執(zhí)行的分支代碼、不存在的設備以及錯誤路徑代碼等難以測試。
Device Simulator Framework(DSF)可以解決這一問題,它擁有一個內核空間到用戶空間的輸入輸出控制接口,讓測試用例開發(fā)人員可以執(zhí)行內核的特定目標區(qū)域。當設備可能不存在時,DSF 特別有助于執(zhí)行設備驅動程序內核代碼。雖然 DSF 不能取代真正的設備測試,但是它可以在很大程度上幫助您調試和測試驅動程序代碼。
DSF 還可以加快測試用例的開發(fā),因為您不必去學習用于用戶/內核空間通信的輸入輸出控制接口。
到目前為止,只支持最近發(fā)布的 Linux 2.5.xx 到當前的 2.6.xx 之間的內核版本。
入門
首先,我建議您下載整個 Linux Test Project (LTP) 測試套件,其中包括 DSF 代碼。Linux Test Project 是 IBM Linux Technology Center (LTC) 與其他一些組織合作的項目(請參閱
參考資料中的鏈接)。
解壓存檔文件后,您將在 testcases/kernel/device-drivers/dev_sim_framework 目錄下找到用戶/內核模板測試代碼。編譯 LTP 測試套件并安裝它,然后切換到 DSF 目錄。進入 DSF 目錄后,您將看到 kernel_space 目錄和 user_space 目錄。相應的內核模塊和用戶空間文件分別在這兩個目錄中。切換到這兩個目錄并運行
make
來編譯模板。
ioctl 函數處理專用文件的底層設備參數。具體來說,很多字符專用文件(例如終端)的操作屬性可以由 ioctl 請求來控制。
回頁首
使用模板
模板編譯完成后,在執(zhí)行用戶空間代碼之前您可以用 insmod
或 modprobe
來加載內核模塊。切換到 user_space 目錄,執(zhí)行用戶空間代碼。由于模板只是與已經注冊的內核模塊通信并返回,所以用戶代碼將運行并迅速返回結果。
修改模板來執(zhí)行期望的內核代碼相對也比較簡單。不過,還是需要一些內核編程的知識。 EXPORT_SYMBOL
標簽內定義的函數對全部內核代碼公開,不用修改內核代碼就可以在您的內核模塊中直接調用。您還可以手工修改內核源代碼來導出另外的函數,用于重新編譯并加載新內核后的測試。
回頁首
DSF 應用
下面的代碼是一個如何實現(xiàn)設備類型測試的例子:
清單 1. 虛擬設備代碼
switch(cmd) { case LTP_OPTION1: rc = test_option(); break; case PCI_ENABLE: rc = pci_enable(); break; default: printk("Mismatching ioctl commandn"); break; } . . . /* * pci_enable * enable a pci device so that it may be used in * later testing in the user test program */ static int pci_enable() { int rc = 0; struct pci_dev *dev = ltp_pci.dev; /* check if can enable the device pointer */ if(!dev) { printk("tpci: dev is NULLn"); return 1; } if( pci_enable_device(dev) ) { printk("tpci: failed to enable pci devicen"); rc = 1; } else { printk("tpci: enabled pci devicen"); rc = 0; } return rc; }
這個例子啟用了一個調用 pci 內核 API 的“虛擬的”PCI 設備。這個虛擬的設備還可以用于其他測試。
回頁首
結束語
如果您是一位具有一定經驗的 Linux 內核和設備驅動程序開發(fā)人員,使用 DSF 將讓您雙重受益:由于 DSF 模板可以用于很多不同的測試,所以您可以更快地開發(fā)測試用例并保證其更加一致。而且,您還可以執(zhí)行內核的特定目標區(qū)域,這樣典型的用戶空間測試用例執(zhí)行內核代碼時就不會再漫無目的。
Linux Test Project 的目標是幫助設備驅動程序開發(fā)人員標準化設備單元測試,提高 Linux 內核中設備驅動程序的穩(wěn)定性??紤]到這一點,歡迎您通過 mridge@us.ibm.com與我聯(lián)系并分享您使用 DSF 的經驗。
參考資料
您可以參閱本文在 developerWorks 全球站點上的 英文原文.Linux Test Project(LTP) 是 IBM's Linux Technology Center與一些行業(yè)合作伙伴的合作項目。
IBM Linux Technology Center 去年對 2.4 內核進行了極其嚴格的全面基準測試。在 測試 Linux 的可靠性( developerWorks, 2003 年 12 月)一文中給出了他們的工作成果。
IBM Linux Technology Center 的 Paul Larson 在 從 2.4 到 2.6 內核開發(fā)中的改進( developerWorks, 2004 年 2 月)一文中揭密了制造 2.6 內核過程中用到的工具和測試。
Linux at IBM站點以報道整個 IBM 的 Linux 新聞和信息為特征。
在 IBM Systems Journal 中您可以閱讀很多關于 IBM 如何進行軟件測試的文章。
IBM 還提供 Performance Management, Testing and Scalability Services。
Linux Kernel Archives是 Linux 內核源代碼的最主要站點;它還編錄并鏈接了從初級到高級的大量信息。
在 developerWorks Linux 專區(qū)可以找到更多為 Linux 開發(fā)人員準備的參考資料。
在 Developer Bookstore 的 Linux 區(qū)可以找到很多精選的關于 Linux 書籍。
關于作者
Martin Ridgeway 是 IBM Linux Technology Center 的 Linux Test Project 的一位團隊領導。去年他所從事的一些項目包括 Linux Test Project 和內核代碼復蓋分析。可以通過 mridge@us.ibm.com 與他聯(lián)系。