基于日志注入的驅(qū)動配置調(diào)試方法
【專利摘要】本發(fā)明公開了一種基于日志注入的驅(qū)動配置調(diào)試方法,包括:S1.提取驅(qū)動的設(shè)備寄存器的配置規(guī)范文檔;S2.按照所述配置規(guī)范文檔對驅(qū)動進(jìn)行檢測鉤子注入;S3.在檢測鉤子位置添加相關(guān)類型的日志函數(shù);S4.運(yùn)行修改后的驅(qū)動,運(yùn)行時動態(tài)監(jiān)測驅(qū)動的運(yùn)行。本發(fā)明基于日志注入的驅(qū)動配置調(diào)試方法,能夠根據(jù)配置文檔的要求,在驅(qū)動中插入檢查代碼,運(yùn)行時動態(tài)檢查驅(qū)動配置中的配置參數(shù),出現(xiàn)錯誤時及時記錄并處理錯誤,從而提高驅(qū)動的可靠性。
【專利說明】基于日志注入的驅(qū)動配置調(diào)試方法【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機(jī)安全防范【技術(shù)領(lǐng)域】,具體涉及一種基于日志注入的驅(qū)動配置調(diào)試方法。
【背景技術(shù)】
[0002]在當(dāng)前的通用操作系統(tǒng)中,驅(qū)動常常以模塊的形式加載到內(nèi)核中運(yùn)行,并調(diào)用了大量的內(nèi)核擴(kuò)展。在Linux中,驅(qū)動占據(jù)了操作系統(tǒng)70%的代碼,并且引起的錯誤是內(nèi)核代碼的3-7倍,在Windows中同樣有報告指出,85%的系統(tǒng)崩潰和驅(qū)動的錯誤相關(guān)。
[0003]驅(qū)動以內(nèi)核擴(kuò)展的形式運(yùn)行,大都運(yùn)行在內(nèi)核態(tài),因而驅(qū)動的可靠性對系統(tǒng)至關(guān)重要。但是由于驅(qū)動的開發(fā)常常和系統(tǒng)開發(fā)是分離的,因此內(nèi)核擴(kuò)展功能發(fā)生的細(xì)微改變都可能引起驅(qū)動出現(xiàn)不穩(wěn)定性。另外,許多驅(qū)動開發(fā)者違反內(nèi)核擴(kuò)展使用規(guī)范,當(dāng)操作系統(tǒng)配置發(fā)生改變時,該種違例將無法提供正確的功能給驅(qū)動程序,可能引起設(shè)備不穩(wěn)定工作,甚至崩潰。
[0004]設(shè)備本身同樣對系統(tǒng)的一些資源存在配置上的約束,以UHCI中的幀基址寄存器為例,從硬件手冊[UHCI revisionl.lsection2.1.5]上可以看出寄存器對低12位要求對齊,在實(shí)際寫入時必須保證低12位為0,從而使得4KB對齊。
[0005]驅(qū)動開發(fā)者在此處使用內(nèi)核擴(kuò)展的內(nèi)存管理接口時,應(yīng)注意使用alloC_page或alloc_pages擴(kuò)展,如果使用kmalloc,則在內(nèi)存調(diào)試開啟尾對齊時將可能存在錯誤。另外,在USB的UHCI驅(qū)動,TD的緩沖區(qū)要求字節(jié)對齊,而QH(隊(duì)列頭)則要求16字節(jié)對齊。
[0006]根據(jù)設(shè)備手冊要求,填入設(shè)備的DMA地址必須是物理內(nèi)存地址,不能使用內(nèi)核的線性地址。但是在部分系統(tǒng)實(shí)現(xiàn)機(jī)制中,內(nèi)核的IG以內(nèi)線性地址和物理地址一致,因此當(dāng)頁表擴(kuò)充,配置表發(fā)生改變時,`沒有轉(zhuǎn)換的線性內(nèi)存地址直接填入DMA將可能引起系統(tǒng)崩潰。
[0007]由于程序員對自身的程序常常足夠自信,測試周期較短,而設(shè)備驅(qū)動的功能和正確性測試常常依賴于具體的硬件,測試周期短,測試場景偏少,僅僅關(guān)心功能實(shí)現(xiàn),而沒有過多考慮系統(tǒng)環(huán)境配置等相關(guān)的功能測試。
[0008]因此,根據(jù)寄存器要求,靜態(tài)注入檢測鉤子,運(yùn)行時動態(tài)檢測配置的參數(shù)是否滿足配置要求是非常有效的錯誤預(yù)防方法,并在出現(xiàn)時及時記錄相應(yīng)的日志,便于開發(fā)者快速定位相關(guān)錯誤。
[0009]綜上所述,一種基于日志注入的驅(qū)動配置調(diào)試方法是亟待提供的。
【發(fā)明內(nèi)容】
[0010](一)要解決的技術(shù)問題
[0011]本發(fā)明要解決的技術(shù)問題是:如何提供一種基于日志注入的驅(qū)動配置調(diào)試方法,能夠根據(jù)配置文檔的要求,在驅(qū)動中插入檢查代碼,運(yùn)行時動態(tài)檢查驅(qū)動配置中的配置參數(shù),出現(xiàn)錯誤時及時記錄并處理錯誤,從而提高驅(qū)動的可靠性。[0012](二)技術(shù)方案
[0013]為解決上述問題,本發(fā)明提供一種基于日志注入的驅(qū)動配置調(diào)試方法,包括:S1.提取驅(qū)動的設(shè)備寄存器的配置規(guī)范文檔;S2.按照所述配置規(guī)范文檔對驅(qū)動進(jìn)行檢測鉤子注入;S3.在檢測鉤子位置添加相關(guān)類型的日志函數(shù);S4.運(yùn)行修改后的驅(qū)動,運(yùn)行時動態(tài)監(jiān)測驅(qū)動的運(yùn)行。
[0014]優(yōu)選地,所述步驟S4包括:當(dāng)出現(xiàn)配置異常時,及時捕獲異常,并對部分錯誤進(jìn)行自動處理,對不能處理的異常,將日志提交開發(fā)者。
[0015]優(yōu)選地,所述步驟SI包括:根據(jù)驅(qū)動要求,對能夠控制設(shè)備的寄存器配置規(guī)范進(jìn)行分析和提取,將寄存器的配置約束條件提取成規(guī)范的可以直接解析的結(jié)構(gòu)化數(shù)據(jù)。
[0016]優(yōu)選地,將寄存器的配置約束條件提取成規(guī)范的可以直接解析的結(jié)構(gòu)化數(shù)據(jù)包括:將設(shè)備手冊中的寄存器約束信息轉(zhuǎn)換為XML文檔規(guī)范信息,一個寄存器的配置信息對應(yīng)一條XML記錄。
[0017]優(yōu)選地,所述步驟S2包括:在驅(qū)動源碼中插入檢測點(diǎn),在檢測點(diǎn)注入相應(yīng)的源代碼,執(zhí)行配置參數(shù)檢查功能。
[0018]優(yōu)選地,所述步驟S3包括:根據(jù)插入的檢測標(biāo)記點(diǎn),在檢測標(biāo)記點(diǎn)通過對參數(shù)進(jìn)行檢查,當(dāng)發(fā)現(xiàn)參數(shù)不符合所述配置規(guī)范文檔中規(guī)定的配置要求時,將添加日志記錄代碼。
[0019]優(yōu)選地,所述步驟S4包括:在系統(tǒng)的正常運(yùn)行過程中,實(shí)現(xiàn)設(shè)備管理功能時,利用驅(qū)動對設(shè)備的寄存器進(jìn)行初始化配置,動態(tài)運(yùn)行時根據(jù)插入的檢測鉤子對配置參數(shù)進(jìn)行檢查。
[0020]優(yōu)選地,所述步驟S4包括:對寄存器進(jìn)行配置時,若配置參數(shù)不滿足設(shè)備規(guī)格文檔中的要求,及時發(fā)現(xiàn)該類錯誤,并記錄相應(yīng)的日志信息。
[0021]優(yōu)選地,所述步驟S4包括:當(dāng)定位到錯誤后,將錯誤進(jìn)行處理,按照文檔中定義的錯誤的嚴(yán)重性,對于引起設(shè)備嚴(yán)重錯誤的情況記錄出錯信息后,直接返回錯誤給上層調(diào)用。
[0022](三)有益效果
[0023]本發(fā)明基于日志注入的驅(qū)動配置調(diào)試方法,能夠根據(jù)配置文檔的要求,在驅(qū)動中插入檢查代碼,運(yùn)行時動態(tài)檢查驅(qū)動配置中的配置參數(shù),出現(xiàn)錯誤時及時記錄并處理錯誤,從而提高驅(qū)動的可靠性。
【專利附圖】
【附圖說明】
[0024]圖1為依照本發(fā)明一種實(shí)施方式的基于日志注入的驅(qū)動配置調(diào)試方法的流程示意圖。
【具體實(shí)施方式】
[0025]下面結(jié)合附圖和實(shí)施例,對本發(fā)明的【具體實(shí)施方式】作進(jìn)一步詳細(xì)描述。以下實(shí)施例用于說明本發(fā)明,但不用來限制本發(fā)明的范圍。
[0026]本發(fā)明提供了一種基于日志注入的驅(qū)動配置調(diào)試方法,包括:
[0027]S1.提取驅(qū)動的設(shè)備寄存器等配置規(guī)范文檔;
[0028]S2.按照驅(qū)動配置文檔對驅(qū)動進(jìn)行檢測鉤子注入;
[0029]S3.在檢測鉤子位置添加相關(guān)類型的日志函數(shù);[0030]S4.運(yùn)行修改后的驅(qū)動,運(yùn)行時動態(tài)監(jiān)測驅(qū)動的運(yùn)行,出現(xiàn)配置異常時,能夠及時捕獲異常,并對部分錯誤進(jìn)行自動處理,對不能處理的異常,將日志提交開發(fā)者,方便驅(qū)動開發(fā)者快速定位程序的錯誤。
[0031]其中,所述步驟SI包括:
[0032]根據(jù)驅(qū)動要求,對能夠控制設(shè)備的寄存器配置規(guī)范進(jìn)行分析和提取,將寄存器的配置約束條件提取成規(guī)范的可以直接解析的結(jié)構(gòu)化數(shù)據(jù)。
[0033]其中,所述步驟SI包括:
[0034]將設(shè)備手冊中的寄存器約束信息轉(zhuǎn)換為XML文檔等規(guī)范信息,一個寄存器的配置信息對應(yīng)一條XML記錄。
[0035]其中,所述步驟S2包括:
[0036]檢測鉤子是指在驅(qū)動源碼中插入檢測點(diǎn),在檢測點(diǎn)可以注入相應(yīng)的源代碼,執(zhí)行配置參數(shù)檢查等功能。
[0037]其中,所述步驟S3包括:
[0038]根據(jù)S2中插入的檢測標(biāo)記點(diǎn),在檢測標(biāo)記點(diǎn)通過對參數(shù)進(jìn)行檢查,當(dāng)發(fā)現(xiàn)參數(shù)不符合SI中所述的文檔規(guī)范中規(guī)定的配置要求時,此時將添加日志記錄代碼。
[0039]其中,所述步驟S4包括:
[0040]在系統(tǒng)的正常運(yùn)行過程中,實(shí)現(xiàn)設(shè)備管理功能時,會利用驅(qū)動對設(shè)備的寄存器進(jìn)行初始化配置,動態(tài)運(yùn)行時根據(jù)S2、S3插入的檢測鉤子對配置參數(shù)進(jìn)行檢查。
[0041]其中,所述步驟S4包括:
[0042]配置異常在此處是指,對寄存器等進(jìn)行配置時,配置參數(shù)不滿足設(shè)備規(guī)格文檔中的要求,及時發(fā)現(xiàn)該類錯誤,并記錄相應(yīng)的日志信息。
[0043]其中,所述步驟S4包括:
[0044]當(dāng)定位到錯誤后,此時需要將錯誤進(jìn)行處理,按照文檔中定義的錯誤的嚴(yán)重性,對于引起設(shè)備嚴(yán)重錯誤的情況記錄出錯信息后,直接返回錯誤給上層調(diào)用。所述不能處理的異常是指,不可預(yù)知的一些錯誤,可能引起設(shè)備出現(xiàn)問題的錯誤,針對該類錯誤,記錄出錯的日志信息供開發(fā)人員查看,便于定位錯誤。
[0045]如圖1所示,本發(fā)明提供的基于日志注入的驅(qū)動配置調(diào)試方法,結(jié)合USB控制器驅(qū)動的幀基址寄存器的操作進(jìn)行解釋,主要包括以下步驟:
[0046]S1.從UHCI設(shè)備手冊中提取關(guān)于USB控制器的幀基址寄存器的約束信息。從硬件手冊[UHCI revisionl.lsection2.1.5]上可以看出寄存器(FLBASEADDW^g 12 位要求對齊,在實(shí)際寫入時必須保證低12位為0,從而使得4KB對齊。將約束信息轉(zhuǎn)換成的結(jié)構(gòu)化數(shù)據(jù)如下所示:
[0047]〈USBFLBASEADD address=’%UHCI_BAR_BASE%+08H’,type=’UINT_32’,kind= ‘Ψ,mask=0x0000001F>
[0048]S2.根據(jù)寄存器的名字FLBASEADD,尋找該寄存器在驅(qū)動中被配置的位置,找到在源碼中的位置,并根據(jù)SI中的mask值,插入檢測鉤子if (uhc1->frame_dma_handle&mask!=0)。
[0049]S3.在檢測鉤子位置繼續(xù)插入相應(yīng)的日志信息,插入的日志為InsertLog (FILE, ROW,ERROR VALUE, TYPE)。即插入日志記錄的內(nèi)容包括,驅(qū)動文件路徑,在文件中的行數(shù),以及出現(xiàn)的值和類型。InsertLog將調(diào)用printk實(shí)現(xiàn)日志輸出功能。
[0050]S4.當(dāng)設(shè)備的驅(qū)動加載時,將會執(zhí)行ConfigureJ1C函數(shù),對幀基址寄存器配置之前將執(zhí)行參數(shù)檢測if (uhc1->frame_dma_handle&mask!=0),正常時則繼續(xù)執(zhí)行配置。若出現(xiàn)錯誤,則會調(diào)用InsertLog函數(shù)記錄錯誤的日志信息。從而,開發(fā)人員通過查看日志能夠快速定位并找出錯誤原因。
[0051]結(jié)合上述描述,針對不同驅(qū)動寄存器配置要求,分離出配置的規(guī)格文檔,然后按照XML文檔對驅(qū)動源碼添加檢測鉤子,并增加日志注入函數(shù)入口,實(shí)現(xiàn)驅(qū)動的配置檢查功倉泛。
[0052]以下是驅(qū)動配置實(shí)例的源代碼:
[0053]
【權(quán)利要求】
1.一種基于日志注入的驅(qū)動配置調(diào)試方法,其特征在于,包括: 51.提取驅(qū)動的設(shè)備寄存器的配置規(guī)范文檔; 52.按照所述配置規(guī)范文檔對驅(qū)動進(jìn)行檢測鉤子注入; 53.在檢測鉤子位置添加相關(guān)類型的日志函數(shù); 54.運(yùn)行修改后的驅(qū)動,運(yùn)行時動態(tài)監(jiān)測驅(qū)動的運(yùn)行。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟S4包括:當(dāng)出現(xiàn)配置異常時,及時捕獲異常,并對部分錯誤進(jìn)行自動處理,對不能處理的異常,將日志提交開發(fā)者。
3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述步驟SI包括: 根據(jù)驅(qū)動要求,對能夠控制設(shè)備的寄存器配置規(guī)范進(jìn)行分析和提取,將寄存器的配置約束條件提取成規(guī)范的可以直接解析的結(jié)構(gòu)化數(shù)據(jù)。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,將寄存器的配置約束條件提取成規(guī)范的可以直接解析的結(jié)構(gòu)化數(shù)據(jù)包括: 將設(shè)備手冊中的寄存器約束信息轉(zhuǎn)換為XML文檔規(guī)范信息,一個寄存器的配置信息對應(yīng)一條XML記錄。
5.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述步驟S2包括: 在驅(qū)動源碼中插入檢測點(diǎn),在檢測點(diǎn)注入相應(yīng)的源代碼,執(zhí)行配置參數(shù)檢查功能。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述步驟S3包括: 根據(jù)插入的檢測標(biāo)記點(diǎn),在檢測標(biāo)記點(diǎn)通過對參數(shù)進(jìn)行檢查,當(dāng)發(fā)現(xiàn)參數(shù)不符合所述配置規(guī)范文檔中規(guī)定的配置要求時,將添加日志記錄代碼。
7.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述步驟S4包括: 在系統(tǒng)的正常運(yùn)行過程中,實(shí)現(xiàn)設(shè)備管理功能時,利用驅(qū)動對設(shè)備的寄存器進(jìn)行初始化配置,動態(tài)運(yùn)行時根據(jù)插入的檢測鉤子對配置參數(shù)進(jìn)行檢查。
8.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述步驟S4包括: 對寄存器進(jìn)行配置時,若配置參數(shù)不滿足設(shè)備規(guī)格文檔中的要求,及時發(fā)現(xiàn)該類錯誤,并記錄相應(yīng)的日志信息。
9.根據(jù)權(quán)利要求2或8所述的方法,其特征在于,所述步驟S4包括: 當(dāng)定位到錯誤后,將錯誤進(jìn)行處理,按照文檔中定義的錯誤的嚴(yán)重性,對于引起設(shè)備嚴(yán)重錯誤的情況記錄出錯信息后,直接返回錯誤給上層調(diào)用。
【文檔編號】G06F11/36GK103559121SQ201310436227
【公開日】2014年2月5日 申請日期:2013年9月23日 優(yōu)先權(quán)日:2013年9月23日
【發(fā)明者】胡事民, 劉虎球, 白家駒, 馬超 申請人:清華大學(xué)