Device Simulator Framework(DSF)為您的所有設備提供了一個易用的輸入輸出控制 (ioctl) 接口,無論這些設備是否確實存在。對那些經驗豐富的內核和設備驅動程序軟件 開發 人員而言,DSF 讓調試和測試設備代碼變得更容易,而這些工作如果沒有 DSF 將難以進行
Device Simulator Framework(DSF)為您的所有設備提供了一個易用的輸入輸出控制 (ioctl) 接口,無論這些設備是否確實存在。對那些經驗豐富的內核和設備驅動程序軟件
開發人員而言,DSF 讓調試和測試設備代碼變得更容易,而這些工作如果沒有 DSF 將難以進行模擬和再現。
為 Linux 內核創建
測試用例相當簡單;通常要麼要求特定的范圍,要麼要求廣泛的范圍。不過,當在用戶空間進行測試時,有一些特殊情況可能很難測試。很少執行的分支代碼、不存在的設備以及錯誤路徑代碼等難以測試。
Device Simulator Framework(DSF)可以解決這一問題,它擁有一個內核空間到用戶空間的輸入輸出控制接口,讓測試用例開發人員可以執行內核的特定目標區域。當設備可能不存在時,DSF 特別有助於執行設備驅動程序內核代碼。雖然 DSF 不能取代真正的設備測試,但是它可以在很大程度上幫助您調試和測試驅動程序代碼。
DSF 還可以加快測試用例的開發,因為您不必去學習用於用戶/內核空間通信的輸入輸出控制接口。
到目前為止,只支持最近發布的 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 來編譯模板。
使用模板 模板編譯完成後,在執行用戶空間代碼之前您可以用 insmod 或 modprobe 來加載內核模塊。切換到 user_space 目錄,執行用戶空間代碼。由於模板只是與已經注冊的內核模塊通信並返回,所以用戶代碼將運行並迅速返回結果。
修改模板來執行期望的內核代碼相對也比較簡單。不過,還是需要一些內核編程的
知識。E
XPORT_SYMBOL 標簽內定義的函數對全部內核代碼公開,不用修改內核代碼就可以在您的內核模塊中直接調用。您還可以手工修改內核源代碼來導出另外的函數,用於重新編譯並加載新內核後的測試。
DSF 應用 下面的代碼是一個如何實現設備類型測試的例子:
清單 1. 虛擬設備代碼
switch(cmd) {
case LTP_OPTION1: rc = test_option(); break;
case PCI_ENABLE: rc = pci_enable(); break;
default:
printk("Mismatching ioctl command\n");
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 NULL\n");
return 1;
}
if( pci_enable_device(dev) ) {
printk("tpci: failed to enable pci device\n");
rc = 1;
}
else {
printk("tpci: enabled pci device\n");
rc = 0;
}
return rc;
}
這個例子啟用了一個調用 pci 內核 API 的“虛擬的”PCI 設備。這個虛擬的設備還可以用於其他測試。
結束語 如果您是一位具有一定經驗的 Linux 內核和設備驅動程序開發人員,使用 DSF 將讓您雙重受益:由於 DSF 模板可以用於很多不同的測試,所以您可以更快地開發測試用例並保證其更加一致。而且,您還可以執行內核的特定目標區域,這樣典型的用戶空間測試用例執行內核代碼時就不會再漫無目的。