摘 要: 針對(duì)Linux驅(qū)動(dòng)程序開發(fā)缺少快速高效測(cè)試手段的問(wèn)題,提出了精確硬件仿真,、實(shí)時(shí)驅(qū)動(dòng)狀態(tài)控制和高效數(shù)據(jù)注入技術(shù),并應(yīng)用到了無(wú)線驅(qū)動(dòng)程序開發(fā)實(shí)踐中,。結(jié)果證明,該技術(shù)能夠快速,、有效地查找出驅(qū)動(dòng)缺陷,提高驅(qū)動(dòng)程序的可靠性,達(dá)到了豐富驅(qū)動(dòng)開發(fā)測(cè)試手段、加快驅(qū)動(dòng)開發(fā)進(jìn)度的效果,。
關(guān)鍵詞: Linux; WiFi; 驅(qū)動(dòng)程序; 測(cè)試
近年來(lái),隨著WiFi技術(shù)的快速發(fā)展和普及,,WiFi芯片及相關(guān)驅(qū)動(dòng)的設(shè)計(jì)開發(fā)已成為短距離無(wú)線通信領(lǐng)域的研究熱點(diǎn),。根據(jù)研究,,在系統(tǒng)運(yùn)行過(guò)程中驅(qū)動(dòng)模塊的缺陷出現(xiàn)頻度是其他內(nèi)核模塊的3~7倍[1],因此需要采用富有成效的開發(fā)測(cè)試方案和手段來(lái)提高驅(qū)動(dòng)程序的穩(wěn)定可靠性,。本文針對(duì)Linux平臺(tái)下的WiFi無(wú)線驅(qū)動(dòng)程序的開發(fā)測(cè)試技術(shù)展開論述,,對(duì)無(wú)線協(xié)議及驅(qū)動(dòng)開發(fā)測(cè)試技術(shù)進(jìn)行簡(jiǎn)單概述,介紹驅(qū)動(dòng)開發(fā)存在的開發(fā)測(cè)試手段匱乏問(wèn)題,,提出了硬件仿真,、狀態(tài)控制和數(shù)據(jù)注入技術(shù)。
1 無(wú)線協(xié)議概述
WiFi技術(shù)經(jīng)過(guò)十幾年的快速發(fā)展,,所支持的無(wú)線傳輸速率已從最初的1 Mb/s提升到1 Gb/s以上,。WiFi技術(shù)主要涉及到網(wǎng)絡(luò)協(xié)議簇的最低兩層:物理層和媒體接入層,其典型的實(shí)現(xiàn)方案如圖1所示,。在圖1中,,物理層采用純硬件的實(shí)現(xiàn)形式,而媒體接入層則采用軟硬件聯(lián)合的實(shí)現(xiàn)方式:對(duì)于時(shí)延特性要求高的功能,采用協(xié)議硬件加速器來(lái)實(shí)現(xiàn);對(duì)于網(wǎng)絡(luò)管理等對(duì)時(shí)延要求不高的其他功能,采用驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)[2-3],。驅(qū)動(dòng)在執(zhí)行過(guò)程中需根據(jù)網(wǎng)絡(luò)當(dāng)前狀態(tài)對(duì)硬件進(jìn)行實(shí)時(shí)配置,,其可靠性和穩(wěn)定性直接決定了整個(gè)WiFi芯片及網(wǎng)絡(luò)的可用性。
在驅(qū)動(dòng)程序的開發(fā)中需要結(jié)合快速,、有效的開發(fā)測(cè)試技術(shù),,但Linux系統(tǒng)在驅(qū)動(dòng)開發(fā)方法和工具方面取得的進(jìn)展有限,目前主要采用printk信息打印,、kgdb源碼調(diào)試及kdump崩潰存儲(chǔ)技術(shù)[4],。由于需要開發(fā)人員精通內(nèi)核底層數(shù)據(jù)結(jié)構(gòu),技術(shù)門檻較高,,導(dǎo)致只有printk打印方式得到了廣泛的應(yīng)用,。對(duì)于非法內(nèi)存訪問(wèn)、無(wú)效內(nèi)存管理及軟硬件響應(yīng)不匹配等常見的無(wú)線驅(qū)動(dòng)缺陷類型,當(dāng)缺陷發(fā)生時(shí)會(huì)導(dǎo)致內(nèi)核和系統(tǒng)的崩潰,,而采用printk等技術(shù)很難查找出這些缺陷[1, 5],。而對(duì)于用戶空間驅(qū)動(dòng)程序、高層建模開發(fā)語(yǔ)言等新興的驅(qū)動(dòng)開發(fā)方案來(lái)說(shuō)[1,5],,由于尚未提供完整的驅(qū)動(dòng)開發(fā)解決方案,且執(zhí)行效率較低,,不適合實(shí)時(shí)吞吐量大的網(wǎng)絡(luò)驅(qū)動(dòng)程序的開發(fā)。
因此需要在現(xiàn)有驅(qū)動(dòng)開發(fā)測(cè)試手段的基礎(chǔ)上,,提出新的高效的開發(fā)測(cè)試技術(shù),,以能夠快速全面查找和定位驅(qū)動(dòng)缺陷,提高驅(qū)動(dòng)程序的可靠性和穩(wěn)定性,。
2 開發(fā)測(cè)試方案
無(wú)線驅(qū)動(dòng)程序需要實(shí)現(xiàn)Linux系統(tǒng)對(duì)無(wú)線網(wǎng)絡(luò)的管理接口,,必須與硬件實(shí)時(shí)交互。因此,無(wú)線驅(qū)動(dòng)程序的開發(fā)涉及到軟硬件聯(lián)合開發(fā)測(cè)試,其面臨的主要問(wèn)題包括:
(1)硬件不可用,。由于硬件開發(fā)周期長(zhǎng),,驅(qū)動(dòng)必須能夠在硬件尚不可用的情形下獨(dú)立開展開發(fā)和測(cè)試。
(2)聯(lián)合測(cè)試問(wèn)題多且不易定位,。在軟硬件聯(lián)合測(cè)試時(shí),,必須能夠快速定位出問(wèn)題的位置是位于驅(qū)動(dòng)還是位于硬件部分。
(3)驅(qū)動(dòng)測(cè)試手段匱乏,,開發(fā)效率低,。這是驅(qū)動(dòng)程序開發(fā)所面臨的一個(gè)共同問(wèn)題,必須提出一個(gè)行之有效的驅(qū)動(dòng)開發(fā)測(cè)試方案來(lái)加快驅(qū)動(dòng)的開發(fā)進(jìn)程,。
針對(duì)上述問(wèn)題,,在實(shí)際的無(wú)線驅(qū)動(dòng)開發(fā)過(guò)程中,本文提出了以下幾種開發(fā)測(cè)試技術(shù):
(1)精確硬件仿真,。為了解決硬件尚不可用的問(wèn)題,,編寫了可精確模擬硬件的接口及行為的內(nèi)核仿真模塊,提供了對(duì)硬件接口,、硬件協(xié)議加速器和基帶的精確模擬,。具體來(lái)說(shuō),模擬的功能包括硬件中斷的產(chǎn)生和處理,、數(shù)據(jù)的發(fā)送和接收,、硬件發(fā)送隊(duì)列的管理,以及對(duì)硬件寄存器和存儲(chǔ)區(qū)的模擬等,。除了模擬硬件正常工作時(shí)的場(chǎng)景,,還可以模擬硬件在實(shí)際工作中可能會(huì)產(chǎn)生的各種錯(cuò)誤,進(jìn)而測(cè)試軟件驅(qū)動(dòng)模塊在硬件發(fā)生異常時(shí)的行為及穩(wěn)定性,,而這是在采用實(shí)際的硬件進(jìn)行測(cè)試時(shí)很難做到的,。通過(guò)采用精確硬件仿真技術(shù),使得無(wú)線驅(qū)動(dòng)程序代碼在與實(shí)際的硬件聯(lián)合測(cè)試時(shí)只需要進(jìn)行少量修改,,甚至不需要修改也能夠正常運(yùn)行,。
(2)實(shí)時(shí)驅(qū)動(dòng)狀態(tài)控制。無(wú)線協(xié)議本質(zhì)上是一個(gè)FSM有限狀態(tài)機(jī),,相應(yīng)的驅(qū)動(dòng)程序也被設(shè)計(jì)為一個(gè)基于事件-消息驅(qū)動(dòng)的系統(tǒng):根據(jù)最新發(fā)生的事件或接收到的消息確定下一步的行為和狀態(tài),。如果能夠?qū)︱?qū)動(dòng)程序的狀態(tài)進(jìn)行控制,能夠?qū)Ⅱ?qū)動(dòng)設(shè)置為任意的狀態(tài),,就可以遍歷驅(qū)動(dòng)程序的狀態(tài)進(jìn)行測(cè)試,。為了實(shí)現(xiàn)驅(qū)動(dòng)狀態(tài)控制功能,在保持驅(qū)動(dòng)程序具有良好的層次結(jié)構(gòu)和清晰的狀態(tài)轉(zhuǎn)移過(guò)程的同時(shí),,增加了驅(qū)動(dòng)狀態(tài)控制模塊,,能夠按需控制和設(shè)置驅(qū)動(dòng)的當(dāng)前狀態(tài)及所需數(shù)據(jù),。在具體實(shí)現(xiàn)時(shí),該控制功能由位于用戶空間的控制程序和位于內(nèi)核空間的控制模塊組成,,采用netlink接口作為兩者之間的通信接口,,運(yùn)行自定義的接口通信協(xié)議。在測(cè)試時(shí),,控制模塊根據(jù)所接收到的控制程序的設(shè)置命令,將驅(qū)動(dòng)程序配置為指定的運(yùn)行狀態(tài),,并全面收集驅(qū)動(dòng)程序的最新事件和消息,,并及時(shí)反饋給控制程序,從而實(shí)現(xiàn)了所需的實(shí)時(shí)驅(qū)動(dòng)狀態(tài)控制功能,。
(3)高效用戶態(tài)數(shù)據(jù)的注入和輸出,。在對(duì)無(wú)線驅(qū)動(dòng)進(jìn)行測(cè)試時(shí),除了需要實(shí)時(shí)控制驅(qū)動(dòng)程序的狀態(tài),,還需要向驅(qū)動(dòng)注入大量的測(cè)試數(shù)據(jù),。常規(guī)的方法是通過(guò)ioctl接口傳輸配置命令,通過(guò)用戶空間的測(cè)試程序發(fā)送和接收待測(cè)數(shù)據(jù)包,。該方法存在的問(wèn)題:一是數(shù)據(jù)傳輸效率低,,二是開發(fā)人員可控的因素較少,很難構(gòu)造出復(fù)雜多變及特殊的測(cè)試數(shù)據(jù),。為了解決上述問(wèn)題,,本文提出了一種高效的用戶態(tài)數(shù)據(jù)的注入和輸出解決方案。在該方案中,,由位于用戶空間的測(cè)試程序產(chǎn)生符合各種測(cè)試需求的測(cè)試數(shù)據(jù),,通過(guò)netlink接口直接注入到位于內(nèi)核空間的無(wú)線驅(qū)動(dòng)程序中;由位于內(nèi)核空間的測(cè)試代理模塊及時(shí)收集驅(qū)動(dòng)的測(cè)試結(jié)果及相關(guān)數(shù)據(jù),,并通過(guò)netlink接口直接輸出到用戶空間的測(cè)試程序,。采用本方案,可以構(gòu)造出任意格式的測(cè)試數(shù)據(jù),,覆蓋各種測(cè)試功能,,可以編寫功能強(qiáng)大的用戶空間分析測(cè)試程序?qū)y(cè)試數(shù)據(jù)和結(jié)果進(jìn)行分析,快速發(fā)現(xiàn)和定位驅(qū)動(dòng)缺陷,。
為了實(shí)現(xiàn)上述開發(fā)方案,,需要在既有的無(wú)線驅(qū)動(dòng)模塊的基礎(chǔ)上增加如圖2所示的其他內(nèi)核模塊和用戶程序。在圖2中,,既有的驅(qū)動(dòng)程序模塊實(shí)現(xiàn)了無(wú)線協(xié)議的功能,;新增的位于用戶空間的控制程序?qū)崟r(shí)控制和監(jiān)視驅(qū)動(dòng)狀態(tài)、生成各種測(cè)試數(shù)據(jù)并分析驅(qū)動(dòng)的處理結(jié)果,;新增的內(nèi)核控制模塊是控制程序的內(nèi)核代理,,負(fù)責(zé)根據(jù)控制程序的命令設(shè)置驅(qū)動(dòng)的狀態(tài)、將測(cè)試數(shù)據(jù)注入到驅(qū)動(dòng)中,并收集驅(qū)動(dòng)的狀態(tài)和數(shù)據(jù)上傳給控制程序進(jìn)行分析處理,;新增的硬件仿真模塊提供對(duì)硬件的精確模擬功能,。通過(guò)在既有的驅(qū)動(dòng)模塊基礎(chǔ)上增加上述軟件模塊,可以在硬件尚不具備的情況下獨(dú)立開展無(wú)線驅(qū)動(dòng)程序的開發(fā)測(cè)試工作,。
3 測(cè)試結(jié)果
在進(jìn)行驅(qū)動(dòng)開發(fā)時(shí),,為了避免由驅(qū)動(dòng)缺陷導(dǎo)致的系統(tǒng)崩潰時(shí)調(diào)試信息丟失的問(wèn)題,采用了如圖3所示的雙機(jī)遠(yuǎn)程開發(fā)測(cè)試方案,。在圖3中,,將被測(cè)機(jī)器(運(yùn)行無(wú)線驅(qū)動(dòng)程序的機(jī)器)通過(guò)有線網(wǎng)絡(luò)連接到遠(yuǎn)程控制機(jī)器,與圖2采用的單機(jī)開發(fā)測(cè)試方案相比,,將位于用戶空間的控制程序遷移到遠(yuǎn)程控制機(jī)器,,而用遠(yuǎn)程控制程序代理守護(hù)進(jìn)程來(lái)代替控制程序,該代理負(fù)責(zé)轉(zhuǎn)發(fā)遠(yuǎn)程控制程序發(fā)送的設(shè)置命令和測(cè)試數(shù)據(jù)到內(nèi)核控制模塊,,收集內(nèi)核控制模塊發(fā)送的狀態(tài)信息和測(cè)試結(jié)果再轉(zhuǎn)發(fā)給遠(yuǎn)程的控制程序,。采用這種開發(fā)配置方案,由于遠(yuǎn)程控制機(jī)器與被測(cè)機(jī)器相互獨(dú)立,,當(dāng)驅(qū)動(dòng)程序在運(yùn)行過(guò)程中由于缺陷導(dǎo)致被測(cè)機(jī)器崩潰時(shí),,則可以在被測(cè)機(jī)器重新啟動(dòng)的同時(shí),在遠(yuǎn)程控制機(jī)器上分析驅(qū)動(dòng)程序輸出的運(yùn)行期信息和調(diào)試日志,,確定系統(tǒng)崩潰時(shí)驅(qū)動(dòng)程序的狀態(tài)及相關(guān)的數(shù)據(jù),,查找出缺陷并及時(shí)更正,然后通過(guò)svn下載到被測(cè)機(jī)器運(yùn)行測(cè)試,,從而可以節(jié)約驅(qū)動(dòng)調(diào)試時(shí)間,,加快驅(qū)動(dòng)缺陷修復(fù)的進(jìn)度。
采用本文介紹的驅(qū)動(dòng)程序開發(fā)技術(shù)和方案,,經(jīng)過(guò)4個(gè)多月的開發(fā)測(cè)試,,成功開發(fā)出了一款滿足課題需求的無(wú)線驅(qū)動(dòng)程序,其中和硬件聯(lián)合測(cè)試的時(shí)間僅用了一個(gè)月左右,,80%以上的驅(qū)動(dòng)缺陷都已經(jīng)在軟硬件聯(lián)合測(cè)試之前就被找到和得以解決,。在無(wú)線驅(qū)動(dòng)的開發(fā)過(guò)程中,統(tǒng)計(jì)出來(lái)的驅(qū)動(dòng)缺陷的類別及該缺陷所占的比例總結(jié)如表1所示,。
在驅(qū)動(dòng)開發(fā)過(guò)程中發(fā)現(xiàn),,由于涉及模塊較多、軟件和硬件單獨(dú)開發(fā)等原因,,出現(xiàn)了較多的軟件模塊間及軟硬件間定義不一致的問(wèn)題,,這類問(wèn)題以及較為普遍的空指針問(wèn)題,容易導(dǎo)致地址非法訪問(wèn)而系統(tǒng)崩潰,。這些問(wèn)題均通過(guò)本文所提出的數(shù)據(jù)注入和驅(qū)動(dòng)狀態(tài)遠(yuǎn)程輸出技術(shù)得以發(fā)現(xiàn)和解決,,并通過(guò)實(shí)時(shí)驅(qū)動(dòng)狀態(tài)控制技術(shù)發(fā)現(xiàn)和解決了程序邏輯錯(cuò)誤類型的缺陷,。硬件本身所具有的缺陷占到了1/4以上,通過(guò)對(duì)硬件進(jìn)行精確全面的仿真,,驅(qū)動(dòng)程序代碼基本上不需要做過(guò)多的改動(dòng),,即可在真正的硬件上通過(guò)測(cè)試,并在輔助硬件開發(fā)人員定性和定位硬件缺陷方面發(fā)揮了較大的作用,。
在Linux驅(qū)動(dòng)程序開發(fā)過(guò)程中,,由于高效的開發(fā)測(cè)試手段的匱乏,使得驅(qū)動(dòng)程序的開發(fā)變得緩慢和困難,。本文提出了硬件仿真,、狀態(tài)控制和數(shù)據(jù)注入等技術(shù),可以有效地輔助完成驅(qū)動(dòng)的開發(fā)測(cè)試工作,,快速高效地查找出驅(qū)動(dòng)缺陷,加快驅(qū)動(dòng)開發(fā)的進(jìn)度,,在驅(qū)動(dòng)程序開發(fā)測(cè)試方面具有良好的借鑒意義,。
參考文獻(xiàn)
[1] 秦瑩,戴華東,顏躍進(jìn).單一內(nèi)核操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序缺陷研究[J]. 計(jì)算機(jī)科學(xué),2011,38(4):182-184.
[2] 潘志鵬,吳斌,楊坤,等.基于AHB總線的靈活可配置WLAN芯片架構(gòu)設(shè)計(jì)[J]. 電子技術(shù)應(yīng)用,2012,38(7):62-65.
[3] 何柳,程鵬,陳勇,等. 802.11網(wǎng)卡Windows驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2013,32(4):3-5.
[4] VENKATESWARAN S.精通Linux設(shè)備驅(qū)動(dòng)程序開發(fā)[M].宋寶華,譯. 北京:人民郵電出版社,2010.
[5] 劉軍衛(wèi), 李曦, 陳香蘭,等. 用戶態(tài)驅(qū)動(dòng)框架的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2011,20(11):67-71.