一種內(nèi)核故障注入方法及電子設(shè)備的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機領(lǐng)域,特別涉及一種內(nèi)核故障注入方法及電子設(shè)備。
【背景技術(shù)】
[0002]目前,Linux系統(tǒng)應用廣泛,在針對Linux內(nèi)核進行應用程序開發(fā)時,檢驗應用程序?qū)inux內(nèi)核故障的容錯機制的有效性非常重要,在Linux內(nèi)核中進行故障注入是必不可少的環(huán)節(jié)。但是,Linux系統(tǒng)的開發(fā)者出于保證內(nèi)核代碼正確性的考慮,不愿意在Linux內(nèi)核源代碼樹中加入一個調(diào)試器,以避免開發(fā)者通過內(nèi)核中的調(diào)試器引入不良的修正,所以對Linux內(nèi)核進行故障注入一直是個棘手的問題。
[0003]內(nèi)核動態(tài)探針(Kernel Dynamic Probes,Kprobes)技術(shù)的出現(xiàn)有效解決了 Linux系統(tǒng)的內(nèi)核故障注入問題,提高了內(nèi)核故障注入的效率。參見圖1,其基本工作機制為:首先,注冊Kprobes結(jié)構(gòu)體,將用戶指定的探測點處的內(nèi)核指令替換為斷點指令,該被替換的內(nèi)核指令即為被探測的指令,然后把一個用戶定義的回調(diào)函數(shù)關(guān)聯(lián)到該斷點指令,當處理器執(zhí)行到該斷點指令時,處理器將轉(zhuǎn)而執(zhí)行與斷點指令相關(guān)聯(lián)的回調(diào)函數(shù),該回調(diào)函數(shù)執(zhí)行時將模擬對應的內(nèi)核故障,在回調(diào)函數(shù)執(zhí)行完后,返回執(zhí)行被探測的指令,繼續(xù)正常的代碼路徑的執(zhí)行,整個故障注入過程中無需對Linux內(nèi)核頻繁編譯和啟動。
[0004]但是,現(xiàn)有技術(shù)中上述故障注入方法存在故障注入的等待時間較長的問題,使得整個應用程序開發(fā)周期延長。
【發(fā)明內(nèi)容】
[0005]本發(fā)明實施例提供一種內(nèi)核故障注入方法及電子設(shè)備,用于解決故障注入的等待時間較長的技術(shù)問題。
[0006]第一方面,本發(fā)明實施例提供了一種內(nèi)核故障注入方法,所述方法包括:
[0007]在加載到內(nèi)存中的內(nèi)核指令集合中有指令被內(nèi)核動態(tài)探針Kprobes結(jié)構(gòu)體中的斷點指令替換時,處理器在執(zhí)行所述斷點指令時,轉(zhuǎn)向執(zhí)行所述Kprobes結(jié)構(gòu)體中與所述斷點指令關(guān)聯(lián)的回調(diào)函數(shù);
[0008]所述處理器在執(zhí)行完所述回調(diào)函數(shù)時,轉(zhuǎn)向執(zhí)行被替換的指令所在函數(shù)返回后的下一條內(nèi)核指令。
[0009]結(jié)合第一方面,在第一方面的第一種可能的實現(xiàn)方式中,處理器執(zhí)行所述Kprobes結(jié)構(gòu)體中與所述斷點指令關(guān)聯(lián)的回調(diào)函數(shù),包括:
[0010]所述處理器將所述回調(diào)函數(shù)中設(shè)定的錯誤狀態(tài)碼寫入數(shù)據(jù)寄存器。
[0011 ] 結(jié)合第一方面,在第一方面的第二種可能的實現(xiàn)方式中,處理器執(zhí)行所述Kprobes結(jié)構(gòu)體中與所述斷點指令關(guān)聯(lián)的回調(diào)函數(shù),包括:
[0012]所述處理器讀取所述Kprobes結(jié)構(gòu)體中保存的所述被替換的指令的數(shù)據(jù)返回位置的位置信息,并確定出所述數(shù)據(jù)返回位置;
[0013]所述處理器生成大小不大于所述數(shù)據(jù)返回位置的存儲容量的混淆數(shù)據(jù),并將所述混淆數(shù)據(jù)寫入所述數(shù)據(jù)返回位置。
[0014]結(jié)合第一方面的第二種可能的實現(xiàn)方式,在第一方面的第三種可能的實現(xiàn)方式中,所述處理器生成大小不大于所述數(shù)據(jù)返回位置的存儲容量的混淆數(shù)據(jù),包括:
[0015]隨機生成大小不大于所述數(shù)據(jù)返回位置的存儲容量的所述混淆數(shù)據(jù);或者
[0016]從設(shè)定混淆數(shù)據(jù)中提取小于所述數(shù)據(jù)返回位置的存儲容量的部分作為所述混淆數(shù)據(jù)。
[0017]第二方面,本發(fā)明實施例還提供了一種內(nèi)核故障注入方法,所述方法包括:
[0018]在加載到內(nèi)存中的內(nèi)核指令集合中有指令被Kprobes結(jié)構(gòu)體中的斷點指令替換時,處理器在執(zhí)行所述斷點指令時,轉(zhuǎn)向執(zhí)行所述Kprobes結(jié)構(gòu)體中與所述斷點指令關(guān)聯(lián)的回調(diào)函數(shù),產(chǎn)生設(shè)定時長的時延,所述設(shè)定時長為所述回調(diào)函數(shù)包含的時間參數(shù);
[0019]所述處理器在產(chǎn)生所述設(shè)定時長的時延后執(zhí)行被替換的指令。
[0020]結(jié)合第二方面,在第二方面的第一種可能的實現(xiàn)方式中,處理器執(zhí)行所述Kprobes結(jié)構(gòu)體中與所述斷點指令關(guān)聯(lián)的回調(diào)函數(shù),產(chǎn)生設(shè)定時長的時延,包括:
[0021]所述處理器記錄執(zhí)行所述回調(diào)函數(shù)時的第一時間;
[0022]所述處理器確定出所述第一時間之后的與所述第一時間相差所述設(shè)定時長的第二時間,以形成所述設(shè)定時長的時延。
[0023]第三方面,本發(fā)明實施例還提供了一種電子設(shè)備,包括:
[0024]內(nèi)存,用于存儲指令;
[0025]處理器,用于執(zhí)行內(nèi)存中存儲的內(nèi)核指令;其中,在加載到內(nèi)存中的內(nèi)核指令集合中有指令被內(nèi)核動態(tài)探針Kprobes結(jié)構(gòu)體中的斷點指令替換時,處理器在執(zhí)行所述斷點指令時,轉(zhuǎn)向執(zhí)行所述Kprobes結(jié)構(gòu)體中與所述斷點指令關(guān)聯(lián)的回調(diào)函數(shù);且所述處理器在執(zhí)行完所述回調(diào)函數(shù)時,轉(zhuǎn)向執(zhí)行被替換的指令所在函數(shù)返回后的下一條內(nèi)核指令。
[0026]結(jié)合第三方面,在第三方面的第一種可能的實現(xiàn)方式中,所述處理器用于執(zhí)行所述Kprobes結(jié)構(gòu)體中與所述斷點指令關(guān)聯(lián)的回調(diào)函數(shù),具體為:將所述回調(diào)函數(shù)中設(shè)定的錯誤狀態(tài)碼寫入數(shù)據(jù)寄存器。
[0027]結(jié)合第三方面,在第三方面的第二種可能的實現(xiàn)方式中,所述處理器用于執(zhí)行所述Kprobes結(jié)構(gòu)體中與所述斷點指令關(guān)聯(lián)的回調(diào)函數(shù),具體為:讀取所述Kprobes結(jié)構(gòu)體中保存的所述被替換的指令的數(shù)據(jù)返回位置的位置信息,并確定出所述數(shù)據(jù)返回位置;以及生成大小不大于所述數(shù)據(jù)返回位置的存儲容量的混淆數(shù)據(jù),并將所述混淆數(shù)據(jù)寫入所述數(shù)據(jù)返回位置。
[0028]結(jié)合第三方面的第二種可能的實現(xiàn)方式,在第三方面的第三種可能的實現(xiàn)方式中,所述處理器用于生成大小不大于所述數(shù)據(jù)返回位置的存儲容量的混淆數(shù)據(jù),具體為:隨機生成大小不大于所述數(shù)據(jù)返回位置的存儲容量的所述混淆數(shù)據(jù);或者從設(shè)定混淆數(shù)據(jù)中提取小于所述數(shù)據(jù)返回位置的存儲容量的部分作為所述混淆數(shù)據(jù)。
[0029]第四方面,本發(fā)明實施例還提供了一種電子設(shè)備,包括:
[0030]內(nèi)存,用于存儲指令;
[0031]處理器,用于執(zhí)行內(nèi)存中存儲的內(nèi)核指令;其中,在加載到內(nèi)存中的內(nèi)核指令集合中有指令被Kprobes結(jié)構(gòu)體中的斷點指令替換時,處理器在執(zhí)行所述斷點指令時,轉(zhuǎn)向執(zhí)行所述Kprobes結(jié)構(gòu)體中與所述斷點指令關(guān)聯(lián)的回調(diào)函數(shù),產(chǎn)生設(shè)定時長的時延,所述設(shè)定時長為所述回調(diào)函數(shù)包含的時間參數(shù);且所述處理器在產(chǎn)生所述設(shè)定時長的時延后執(zhí)行被替換的指令。
[0032]結(jié)合第四方面,在第四方面的第一種可能的實現(xiàn)方式中,所述處理器用于執(zhí)行所述Kprobes結(jié)構(gòu)體中與所述斷點指令關(guān)聯(lián)的回調(diào)函數(shù),產(chǎn)生設(shè)定時長的時延,具體為:記錄執(zhí)行所述回調(diào)函數(shù)時的第一時間;以及確定出所述第一時間之后的與所述第一時間相差所述設(shè)定時長的第二時間,以形成所述設(shè)定時長的時延。
[0033]本申請實施例中提供的一個或多個技術(shù)方案,至少具有如下技術(shù)效果或優(yōu)點:
[0034]本申請實施例中,處理器在執(zhí)行到斷點指令時,轉(zhuǎn)向執(zhí)行Kprobes結(jié)構(gòu)體中與斷點指令關(guān)聯(lián)的回調(diào)函數(shù),進而實現(xiàn)故障注入,并在實現(xiàn)故障注入之后,直接執(zhí)行被斷點指令替換的內(nèi)核指令所在的函數(shù)返回后的下一條內(nèi)核指令,減少了處理器所執(zhí)行的指令數(shù)量,減少了下一次內(nèi)核故障注入的等待時間,縮短了應用程序的開發(fā)周期。
【附圖說明】
[0035]為了更清楚地說明本申請實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡要介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域的普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0036]圖1為現(xiàn)有技術(shù)中利用Kprobes進行內(nèi)核故障注入的示例圖;
[0037]圖2為本申請實施例1中內(nèi)核故障注入方法的流程示意圖;
[0038]圖3為本申請實施例1中一應用實例的流程示意圖;
[0039]圖4為本申請實施例1中另一應用實例的流程示意圖;
[0040]圖5為本申請實施例2中內(nèi)核故障注入方法的流程示意圖;
[0041]圖6為本申請實施例3中電子設(shè)備的結(jié)構(gòu)示意框圖;
[0042]圖7為本申請實施例3中電子設(shè)備的詳細結(jié)構(gòu)示意框圖;
[0043]圖8為本申請實施例4中電子設(shè)備的結(jié)構(gòu)示意框圖;
[0044]圖9為本申請實施例4中電子設(shè)備的詳細結(jié)構(gòu)示意框圖。
【具體實施方式】
[0045]針對現(xiàn)有技術(shù)中利用Kprobes進行內(nèi)核故障注入的過程中存在故障注入的等待時間較長的技術(shù)問題,本申請實施例提供了一種內(nèi)核故障注入方法,在該內(nèi)核故障注入方法中,處理器在執(zhí)行完與斷點指令關(guān)聯(lián)的回調(diào)函數(shù)后,結(jié)束對被斷點指令替換的內(nèi)核指令所在函數(shù)的調(diào)用,直接執(zhí)行被替換的內(nèi)核指令所在函數(shù)返回后的下一條指令,減少了處理器所執(zhí)行的指令數(shù)量,減少了下一次內(nèi)核故障注入的等待時間,縮短了應用程序的開發(fā)周期。
[0046]下面通過附圖以及具體實施例對本申請技術(shù)方案做詳細的說明,應當理解本申請實施例以及實施例中的具體特征是對本申請技術(shù)方案的詳細的說明,而不是對本申請技術(shù)方案的限定,在不沖突的情況下,本申請實施例以及實施例中的技術(shù)特征可以相互組合。
[0047]為了便于描述,首先介紹本