一種Linux系統(tǒng)內(nèi)核新功能增加方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及的是一種Iinux系統(tǒng)內(nèi)核的新功能增加方法。
【背景技術(shù)】
[0002]通常情況下,Linux系統(tǒng)除非主動(dòng)輸出信息或者處于調(diào)試模式下,應(yīng)用層的程序是很難在運(yùn)行過程中輸出調(diào)試信息的,作為L(zhǎng)inux操作系統(tǒng)重中之重的內(nèi)核更是如此。
[0003]當(dāng)研發(fā)人員針對(duì)某特定Linux系統(tǒng)內(nèi)核進(jìn)行增加功能時(shí),一般的方案有重新編譯內(nèi)核和修改內(nèi)核中某個(gè)特定的功能函數(shù)兩種。第一種方案是最容易做到也是最不可行的方案,最容易做到是因?yàn)長(zhǎng)inux內(nèi)核源碼時(shí)開放的,最不可行是因?yàn)長(zhǎng)inux系統(tǒng)的碎片化比較嚴(yán)重,當(dāng)前Linux系統(tǒng)內(nèi)核很有可能是定制好的,重新編譯原始內(nèi)核代碼想要形成和當(dāng)前內(nèi)核功能完全一致幾乎是不可能的;第二種方案通過修改特定的功能函數(shù),使該功能函數(shù)完成所增加的功能即可實(shí)現(xiàn)開發(fā)目標(biāo)。針對(duì)第二種方案,難點(diǎn)之一在于如何讓一個(gè)穩(wěn)定成型的內(nèi)核主動(dòng)通過調(diào)用新實(shí)現(xiàn)的功能函數(shù)來實(shí)現(xiàn)新的功能;難點(diǎn)之二在于是否能夠在碎片化嚴(yán)重的Linux系統(tǒng)上做到通用。
[0004]目前采用大多采用Linux系統(tǒng)調(diào)用表地址修改和Linux內(nèi)核kprobe類調(diào)用兩種方式來實(shí)現(xiàn)新功能的增加,但Linux系統(tǒng)調(diào)用表地址修改只能自定義系統(tǒng)調(diào)用,使用該方法只能進(jìn)行有限的內(nèi)核功能擴(kuò)展。Linux系統(tǒng)調(diào)用表地址修改過程中,不同的內(nèi)核版本和不同的發(fā)行版本下系統(tǒng)調(diào)用表的地址和相同系統(tǒng)調(diào)用在系統(tǒng)調(diào)用表中的索引是不一定相同的,難以通用。Kprobe是Linux內(nèi)核自帶的一種代碼注入方式,其過程就是利用實(shí)現(xiàn)好的內(nèi)核注冊(cè)方法,在功能函數(shù)執(zhí)行前或后去主動(dòng)執(zhí)行注冊(cè)好的新功能函數(shù),根據(jù)新功能函數(shù)的返回值來確定功能函數(shù)的執(zhí)行情況。但Linux內(nèi)核kprobe類調(diào)用屬于內(nèi)核自帶功能,需要內(nèi)核支持,多數(shù)定制平臺(tái)考慮到性能問題取消該功能。Linux內(nèi)核kprobe類調(diào)用難以實(shí)現(xiàn)多模塊重復(fù)自定義。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的就是針對(duì)現(xiàn)有技術(shù)所存在的不足,而提供一種Linux系統(tǒng)內(nèi)核新功能增加方法的技術(shù)方案,該方案的方法不依賴內(nèi)核支持,不依賴系統(tǒng)調(diào)用表,可以支持重復(fù)自定義,并且保證了原功能函數(shù)的調(diào)用,便于推廣通用。
[0006]本方案是通過如下技術(shù)措施來實(shí)現(xiàn)的:一種Linux系統(tǒng)內(nèi)核新功能增加方法,其特征在于包括如下步驟:
1)在原功能函數(shù)的起始地址處設(shè)置跳轉(zhuǎn)區(qū),跳轉(zhuǎn)到新功能函數(shù);
2)運(yùn)行新功能函數(shù),判斷新功能函數(shù)是否需要調(diào)用原功能函數(shù),如果需要,則進(jìn)入步驟3),不需要調(diào)用則繼續(xù)執(zhí)行新功能函數(shù),直至結(jié)束;
3)進(jìn)入模板函數(shù),通過模板函數(shù)的代碼修改區(qū)和跳回區(qū)跳回到原功能函數(shù);
4)執(zhí)行原功能函數(shù)直至原功能函數(shù)結(jié)束,返回新功能函數(shù)繼續(xù)執(zhí)行,直至新功能函數(shù)執(zhí)行結(jié)束。
[0007]所述的跳轉(zhuǎn)區(qū)用于存儲(chǔ)跳轉(zhuǎn)到新功能函數(shù)的跳轉(zhuǎn)指令。
[0008]模板函數(shù)的代碼修改區(qū)用于存儲(chǔ)調(diào)取原功能函數(shù)的指令。
[0009]所述的跳回區(qū)用于存儲(chǔ)跳回原功能函數(shù)的指令。
[0010]模板函數(shù)還設(shè)置有備份區(qū),用于備份跳轉(zhuǎn)區(qū)內(nèi)原功能函數(shù)的指令。
[0011]在模板函數(shù)的起始位置設(shè)置有返回區(qū),用于存儲(chǔ)函數(shù)調(diào)用錯(cuò)誤時(shí)返回的指令。
[0012]所訴的步驟2)判斷新功能函數(shù)是否需要調(diào)用原功能函數(shù)來實(shí)現(xiàn)全功能的內(nèi)核。
[0013]所述的步驟3)中跳回到原功能函數(shù)是跳轉(zhuǎn)到跳轉(zhuǎn)區(qū)以下的函數(shù),不包括跳轉(zhuǎn)區(qū)。
[0014]本方案的有益效果可根據(jù)對(duì)上述方案的敘述得知,由于在該方案中設(shè)置有跳轉(zhuǎn)區(qū),即在原功能函數(shù)的跳轉(zhuǎn)區(qū)內(nèi)的代碼修改,實(shí)現(xiàn)了新功能函數(shù)的調(diào)用,并且跳轉(zhuǎn)區(qū)的長(zhǎng)度不能破壞原功能函數(shù)指令,并且跳轉(zhuǎn)區(qū)的長(zhǎng)度要大于等于完成一次跳轉(zhuǎn)指令所述長(zhǎng)度;有備份區(qū),用于備份跳轉(zhuǎn)區(qū)中原功能函數(shù)原有的指令;有代碼修改區(qū),絕大多數(shù)情況下,新功能函數(shù)都需要調(diào)用原功能函數(shù)來實(shí)現(xiàn)全功能的內(nèi)核方法,所有需要修復(fù)原函數(shù),通過逐條解析備份區(qū)的指令,如果發(fā)現(xiàn)指令中存在相對(duì)偏移跳轉(zhuǎn),需要進(jìn)行偏移地址的轉(zhuǎn)換以保證代碼順利執(zhí)行,當(dāng)備份區(qū)的代碼全部完成轉(zhuǎn)換后,將轉(zhuǎn)換后的代碼填寫至代碼修改區(qū),代碼修改的大小需要轉(zhuǎn)換后的代碼可以全部存儲(chǔ);。
[0015]由此可見,本發(fā)明與現(xiàn)有技術(shù)相比,具有突出的實(shí)質(zhì)性特點(diǎn)和顯著的進(jìn)步,其實(shí)施的有益效果也是顯而易見的。
【附圖說明】
[0016]圖1為本發(fā)明【具體實(shí)施方式】的示意圖。
【具體實(shí)施方式】
[0017]為能清楚說明本方案的技術(shù)特點(diǎn),下面通過一個(gè)【具體實(shí)施方式】,并結(jié)合其附圖,對(duì)本方案進(jìn)行闡述。
[0018]通過附圖可以看出,本方案的:一種Linux系統(tǒng)內(nèi)核新功能增加方法,其特征在于包括如下步驟:
1)在原功能函數(shù)的起始地址處設(shè)置跳轉(zhuǎn)區(qū),跳轉(zhuǎn)到新功能函數(shù)的起始地址,所述的跳轉(zhuǎn)區(qū)用于存儲(chǔ)跳轉(zhuǎn)到新功能函數(shù)的跳轉(zhuǎn)指令;
2)運(yùn)行新功能函數(shù),判斷新功能函數(shù)是否需要調(diào)用原功能函數(shù),如果需要,則進(jìn)入步驟3),不需要調(diào)用則繼續(xù)執(zhí)行新功能函數(shù),直至結(jié)束;
3)進(jìn)入模板函數(shù),通過模板函數(shù)的代碼修改區(qū)和跳回區(qū)跳回到原功能函數(shù),即調(diào)回原功能函數(shù)的(5),模板函數(shù)的代碼修改區(qū)用于存儲(chǔ)調(diào)取原功能函數(shù)的指令,所述的跳回區(qū)用于存儲(chǔ)跳回原功能函數(shù)的指令;
4)執(zhí)行原功能函數(shù)直至原功能函數(shù)結(jié)束,返回新功能函數(shù)繼續(xù)執(zhí)行,直至新功能函數(shù)執(zhí)行結(jié)束。
[0019]模板函數(shù)還設(shè)置有備份區(qū),用于備份跳轉(zhuǎn)區(qū)內(nèi)原功能函數(shù)的指令。在模板函數(shù)的起始位置設(shè)置有返回區(qū),用于存儲(chǔ)函數(shù)調(diào)用錯(cuò)誤時(shí)返回的指令。
[0020]所訴的步驟2)判斷新功能函數(shù)是否需要調(diào)用原功能函數(shù)來實(shí)現(xiàn)全功能的內(nèi)核。
[0021]本發(fā)明并不僅限于上述【具體實(shí)施方式】,本領(lǐng)域普通技術(shù)人員在本發(fā)明的實(shí)質(zhì)范圍內(nèi)做出的變化、改型、添加或替換,也應(yīng)屬于本發(fā)明的保護(hù)范圍。
【主權(quán)項(xiàng)】
1.一種Linux系統(tǒng)內(nèi)核新功能增加方法,其特征在于包括如下步驟: 1)在原功能函數(shù)的起始地址處設(shè)置跳轉(zhuǎn)區(qū),跳轉(zhuǎn)到新功能函數(shù); 2)運(yùn)行新功能函數(shù),判斷新功能函數(shù)是否需要調(diào)用原功能函數(shù),如果需要,則進(jìn)入步驟3),不需要調(diào)用則繼續(xù)執(zhí)行新功能函數(shù),直至結(jié)束; 3)進(jìn)入模板函數(shù),通過模板函數(shù)的代碼修改區(qū)和跳回區(qū)跳回到原功能函數(shù); 4)執(zhí)行原功能函數(shù)直至原功能函數(shù)結(jié)束,返回新功能函數(shù)繼續(xù)執(zhí)行,直至新功能函數(shù)執(zhí)行結(jié)束。
2.根據(jù)權(quán)利要求1所述的Linux系統(tǒng)內(nèi)核新功能增加方法,其特征是:所述的跳轉(zhuǎn)區(qū)用于存儲(chǔ)跳轉(zhuǎn)到新功能函數(shù)的跳轉(zhuǎn)指令。
3.根據(jù)權(quán)利要求1或2所述的Linux系統(tǒng)內(nèi)核新功能增加方法,其特征是:模板函數(shù)的代碼修改區(qū)用于存儲(chǔ)調(diào)取原功能函數(shù)的指令。
4.根據(jù)權(quán)利要求3所述的Linux系統(tǒng)內(nèi)核新功能增加方法,其特征是:所述的跳回區(qū)用于存儲(chǔ)跳回原功能函數(shù)的指令。
5.根據(jù)權(quán)利要求1所述的Linux系統(tǒng)內(nèi)核新功能增加方法,其特征是:模板函數(shù)還設(shè)置有備份區(qū),用于備份跳轉(zhuǎn)區(qū)內(nèi)原功能函數(shù)的指令。
6.根據(jù)權(quán)利要求1所述的Linux系統(tǒng)內(nèi)核新功能增加方法,其特征是:在模板函數(shù)的起始位置設(shè)置有返回區(qū),用于存儲(chǔ)函數(shù)調(diào)用錯(cuò)誤時(shí)返回的指令。
7.根據(jù)權(quán)利要求1所述的Linux系統(tǒng)內(nèi)核新功能增加方法,其特征是:所訴的步驟2)判斷新功能函數(shù)是否需要調(diào)用原功能函數(shù)來實(shí)現(xiàn)全功能的內(nèi)核。
8.根據(jù)權(quán)利要求1所述的Linux系統(tǒng)內(nèi)核新功能增加方法,其特征是:所述的步驟3)中跳回到原功能函數(shù)是跳轉(zhuǎn)到跳轉(zhuǎn)區(qū)以下的函數(shù),不包括跳轉(zhuǎn)區(qū)。
【專利摘要】本發(fā)明提供了一種Linux系統(tǒng)內(nèi)核新功能增加方法技術(shù)方案,該方案的方法具有原功能函數(shù)、模板函數(shù)、新功能函數(shù)等,并且有相應(yīng)的跳轉(zhuǎn)區(qū)、跳回區(qū),使得該方案的方法不依賴內(nèi)核支持,不依賴系統(tǒng)調(diào)用表,可以支持重復(fù)自定義,并且保證了原功能函數(shù)的調(diào)用,便于推廣通用。
【IPC分類】G06F9-445, G06F11-14
【公開號(hào)】CN104765634
【申請(qǐng)?zhí)枴緾N201510225590
【發(fā)明人】朱廣傳, 劉曉萌, 陳丹偉, 任勛益, 苗功勛, 萬海山
【申請(qǐng)人】山東中孚信息產(chǎn)業(yè)股份有限公司
【公開日】2015年7月8日
【申請(qǐng)日】2015年5月6日