歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> 關於Unix

Linux內核SimulatorFramework入門

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 目錄,執行用戶空間代碼。由於模板只是與已經注冊的內核模塊通信並返回,所以用戶代碼將運行並迅速返回結果。
  
  修改模板來執行期望的內核代碼相對也比較簡單。不過,還是需要一些內核編程的知識。EXPORT_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 模板可以用於很多不同的測試,所以您可以更快地開發測試用例並保證其更加一致。而且,您還可以執行內核的特定目標區域,這樣典型的用戶空間測試用例執行內核代碼時就不會再漫無目的。

Copyright © Linux教程網 All Rights Reserved