加載Linux內(nèi)核驅(qū)動(dòng)的方法及裝置制造方法【專利摘要】本發(fā)明公開了一種加載Linux內(nèi)核驅(qū)動(dòng)的方法及裝置,其中的方法包括:選擇與目標(biāo)系統(tǒng)的CPU平臺(tái)一致的內(nèi)核代碼作為編譯初始通用內(nèi)核驅(qū)動(dòng)的參考內(nèi)核代碼;在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié),并將填充后的參考內(nèi)核代碼與初始通用內(nèi)核驅(qū)動(dòng)一起編譯;在目標(biāo)系統(tǒng)中查找目標(biāo)系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng),并根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng),生成通用內(nèi)核驅(qū)動(dòng);將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。采用本發(fā)明的技術(shù)方案,可以把一個(gè)通用內(nèi)核驅(qū)動(dòng)加載到不同內(nèi)核版本的目標(biāo)系統(tǒng)中去;可以把同一個(gè)驅(qū)動(dòng)加載到大部分的Android手機(jī)里?!緦@f明】加載Linux內(nèi)核驅(qū)動(dòng)的方法及裝置【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及計(jì)算機(jī)【
技術(shù)領(lǐng)域:
】,具體涉及一種加載Linux內(nèi)核驅(qū)動(dòng)的方法及裝置。【
背景技術(shù):
】[0002]Linux系統(tǒng)中,加載內(nèi)核驅(qū)動(dòng)的方法是調(diào)用insmod命令。由于Linux的特性,力口載的內(nèi)核驅(qū)動(dòng)的版本信息必須和內(nèi)核的版本信息完全一致,才能夠加載成功。并且由于內(nèi)核版本升級(jí)頻繁,并且眾多廠商都有自己的定制,導(dǎo)致市場(chǎng)上Android手機(jī)上的Linux內(nèi)核版本多種多樣。為了開發(fā)一個(gè)內(nèi)核驅(qū)動(dòng)能夠運(yùn)行在某一款A(yù)ndroid手機(jī)上,必須找到對(duì)應(yīng)的手機(jī)的內(nèi)核源碼,把自己的內(nèi)核驅(qū)動(dòng)代碼和內(nèi)核代碼一起編譯。這種方式增加了巨大的開發(fā)工作量,需要收集海量的各種版本的內(nèi)核源代碼,針對(duì)各版本內(nèi)核編譯對(duì)應(yīng)的內(nèi)核驅(qū)動(dòng),甚至有些設(shè)備的內(nèi)核源代碼根本收集不到,這樣就給內(nèi)核驅(qū)動(dòng)的通用性帶來了致命的限制?!?br/>發(fā)明內(nèi)容】[0003]鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的加載Linux內(nèi)核驅(qū)動(dòng)的方法及裝置。[0004]依據(jù)本發(fā)明的一個(gè)方面,提供一種加載Linux內(nèi)核驅(qū)動(dòng)的方法,包括:選擇與目標(biāo)系統(tǒng)的CPU平臺(tái)一致的內(nèi)核代碼作為編譯初始通用內(nèi)核驅(qū)動(dòng)的參考內(nèi)核代碼;在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié),并將填充后的參考內(nèi)核代碼與初始通用內(nèi)核驅(qū)動(dòng)一起編譯;在目標(biāo)系統(tǒng)中查找目標(biāo)系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng),并根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng),生成通用內(nèi)核驅(qū)動(dòng);將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0005]優(yōu)選的,所述在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié)包括:修改參考內(nèi)核代碼的include/linux/module,h文件中的structmodule結(jié)構(gòu)體,在結(jié)構(gòu)體尾部填充預(yù)定大小的字節(jié)。[0006]優(yōu)選的,所述填充預(yù)定大小的字節(jié),保證經(jīng)過填充后的參考內(nèi)核代碼的structmodule結(jié)構(gòu)體大于目標(biāo)系統(tǒng)的structmodule結(jié)構(gòu)體。[0007]優(yōu)選的,所述根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng)包括:從所述參考驅(qū)動(dòng)中提取內(nèi)核校驗(yàn)需要使用到的校驗(yàn)信息;根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息。[0008]優(yōu)選的,所述校驗(yàn)信息是指內(nèi)核版本信息=Vermagic信息;所述根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息包括:將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段。[0009]優(yōu)選的,所述校驗(yàn)信息是指內(nèi)核驅(qū)動(dòng)版本信息以及所使用的導(dǎo)出符號(hào)的版本信息vers1ns區(qū)開始64字節(jié);所述根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息包括:用所述參考驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)。[0010]優(yōu)選的,所述根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng)包括:從所述參考驅(qū)動(dòng)中提取加載執(zhí)行函數(shù)和卸載執(zhí)行函數(shù)的重定位信息;根據(jù)從參考驅(qū)動(dòng)中提取的所述重定位信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息。[0011]優(yōu)選的,所述重定位信息是指this_module.1nit和this_mosule.exit的重定位信息;所述根據(jù)從參考驅(qū)動(dòng)中提取的所述重定位信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息包括:將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。[0012]優(yōu)選的,所述根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng)包括:判斷所述參考驅(qū)動(dòng)中是否包含rel.gnu.linkonce.this_module區(qū);若否,在文件系統(tǒng)中搜索包含rel.gnu.linkonce.this_module區(qū)的參考驅(qū)動(dòng);若是,首先將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段,然后用所述參考驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的.vers1ns區(qū)開始64字節(jié),最后判斷參考驅(qū)動(dòng)與初始通用內(nèi)核驅(qū)動(dòng)的rel.gnu.linkonce.this_module區(qū)大小是否一致,如果一致,將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。[0013]優(yōu)選的,將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中包括:將通用內(nèi)核驅(qū)動(dòng)寫入文件中,通過insmod命令將通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中;或者,利用內(nèi)存中的通用內(nèi)核驅(qū)動(dòng)調(diào)用init_module系統(tǒng)調(diào)用,將所述通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0014]優(yōu)選的,所述初始通用內(nèi)核驅(qū)動(dòng)是基于標(biāo)準(zhǔn)Linux內(nèi)核源代碼編譯生成的。[0015]優(yōu)選的,如果所述目標(biāo)系統(tǒng)是android系統(tǒng),則選擇android系統(tǒng)的內(nèi)核源代碼作為所述參考內(nèi)核代碼;如果所述目標(biāo)系統(tǒng)是Ubuntu系統(tǒng),則選擇ubuntu系統(tǒng)的內(nèi)核源代碼作為所述參考內(nèi)核代碼。[0016]依據(jù)本發(fā)明的另一個(gè)方面,提供一種加載Linux內(nèi)核驅(qū)動(dòng)的裝置,包括:參考內(nèi)核代碼選擇單元,用于選擇與目標(biāo)系統(tǒng)的CPU平臺(tái)一致的內(nèi)核代碼作為編譯初始通用內(nèi)核驅(qū)動(dòng)的參考內(nèi)核代碼;初始通用內(nèi)核代碼編譯單元,用于在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié),并將填充后的參考內(nèi)核代碼與初始通用內(nèi)核驅(qū)動(dòng)一起編譯;通用內(nèi)核驅(qū)動(dòng)生成單元,用于在目標(biāo)系統(tǒng)中查找目標(biāo)系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng),并根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng),生成通用內(nèi)核驅(qū)動(dòng);通用內(nèi)核驅(qū)動(dòng)加載單元,用于將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0017]優(yōu)選的,所述初始通用內(nèi)核代碼編譯單元具體用于:修改參考內(nèi)核代碼的include/linux/module,h文件中的structmodule結(jié)構(gòu)體,在結(jié)構(gòu)體尾部填充預(yù)定大小的字節(jié)。[0018]優(yōu)選的,所述初始通用內(nèi)核代碼編譯單元所填充預(yù)定大小的字節(jié),保證經(jīng)過填充后的參考內(nèi)核代碼的structmodule結(jié)構(gòu)體大于目標(biāo)系統(tǒng)的structmodule結(jié)構(gòu)體。[0019]優(yōu)選的,所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:從所述參考驅(qū)動(dòng)中提取內(nèi)核校驗(yàn)需要使用到的校驗(yàn)信息;以及,根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息。[0020]優(yōu)選的,所述校驗(yàn)信息是指內(nèi)核版本信息:vermagic信息;所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段。[0021]優(yōu)選的,所述校驗(yàn)信息是指內(nèi)核驅(qū)動(dòng)版本信息以及所使用的導(dǎo)出符號(hào)的版本信息vers1ns區(qū)開始64字節(jié);所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:用所述參考驅(qū)動(dòng)的.vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)。[0022]優(yōu)選的,所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:從所述參考驅(qū)動(dòng)中提取加載執(zhí)行函數(shù)和卸載執(zhí)行函數(shù)的重定位信息;以及,根據(jù)從參考驅(qū)動(dòng)中提取的所述重定位信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息。[0023]優(yōu)選的,所述重定位信息是指this_module.1nit和this_mosule.exit的重定位信息;所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。[0024]優(yōu)選的,所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:判斷所述參考驅(qū)動(dòng)中是否包含rel.gnu.linkonce.this_module區(qū);若否,在文件系統(tǒng)中搜索包含rel.gnu.linkonce.this_module區(qū)的參考驅(qū)動(dòng);若是,首先將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段,然后用所述參考驅(qū)動(dòng)的.vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié),最后判斷參考驅(qū)動(dòng)與初始通用內(nèi)核驅(qū)動(dòng)的rel.gnu.linkonce.this_module區(qū)大小是否一致,如果一致,將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。[0025]優(yōu)選的,所述通用內(nèi)核驅(qū)動(dòng)加載單元具體用于:將通用內(nèi)核驅(qū)動(dòng)寫入文件中,通過insmod命令將通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中;或者,利用內(nèi)存中的通用內(nèi)核驅(qū)動(dòng)調(diào)用init_module系統(tǒng)調(diào)用,將所述通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0026]優(yōu)選的,所述初始通用內(nèi)核驅(qū)動(dòng)是基于標(biāo)準(zhǔn)Linux內(nèi)核源代碼編譯生成的。[0027]優(yōu)選的,如果所述目標(biāo)系統(tǒng)是android系統(tǒng),則所述參考內(nèi)核代碼選擇單元選擇android系統(tǒng)的內(nèi)核源代碼作為所述參考內(nèi)核代碼;如果所述目標(biāo)系統(tǒng)是ubuntu系統(tǒng),則所述參考內(nèi)核代碼選擇單元選擇ubuntu系統(tǒng)的內(nèi)核源代碼作為所述參考內(nèi)核代碼。[0028]可見,本發(fā)明方案通過在參考內(nèi)核代碼結(jié)構(gòu)體中增加一些填充字節(jié),避免目標(biāo)系統(tǒng)中結(jié)構(gòu)體大于通用內(nèi)核驅(qū)動(dòng)中結(jié)構(gòu)體,從而避免訪問越界;并且,通過根據(jù)參考驅(qū)動(dòng)修改初通用始內(nèi)核驅(qū)動(dòng),使得生成的通用內(nèi)核驅(qū)動(dòng)可以通過目標(biāo)系統(tǒng)的校驗(yàn)以及被正常調(diào)用。采用本發(fā)明的技術(shù)方案,可以把一個(gè)通用內(nèi)核驅(qū)動(dòng)加載到不同內(nèi)核版本的目標(biāo)系統(tǒng)中去;可以把同一個(gè)驅(qū)動(dòng)加載到大部分的Android手機(jī)里。[0029]上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的【具體實(shí)施方式】。【專利附圖】【附圖說明】[0030]通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:[0031]圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的加載Linux內(nèi)核驅(qū)動(dòng)的方法流程圖;[0032]圖2示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的根據(jù)參考驅(qū)動(dòng)的信息修改初始通用內(nèi)核驅(qū)動(dòng)的流程圖;以及[0033]圖3示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的加載Linux內(nèi)核驅(qū)動(dòng)的裝置結(jié)構(gòu)示意圖?!揪唧w實(shí)施方式】[0034]下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。[0035]—般加載內(nèi)核驅(qū)動(dòng)的方法是調(diào)用命令insmod。insmod命令首先把需要加載的內(nèi)核驅(qū)動(dòng)讀入內(nèi)存,然后調(diào)用系統(tǒng)調(diào)用init_module,把內(nèi)核驅(qū)動(dòng)在內(nèi)存中的地址和長(zhǎng)度,以及驅(qū)動(dòng)的參數(shù)傳遞給內(nèi)核。insmod命令通過系統(tǒng)調(diào)用init_module進(jìn)入內(nèi)核后,內(nèi)核首先把用戶空間內(nèi)存里的驅(qū)動(dòng)拷貝到內(nèi)核空間,然后檢查內(nèi)核驅(qū)動(dòng)是否符合ELF格式,如果不符合,則內(nèi)核拒絕加載該驅(qū)動(dòng)。接下來內(nèi)核會(huì)根據(jù)ELF(ExecutableandLinkableFormat,可執(zhí)行連接格式)的格式分析內(nèi)核驅(qū)動(dòng)的各種信息,進(jìn)行判斷、檢驗(yàn),如果校驗(yàn)失敗則拒絕加載該驅(qū)動(dòng)。[0036]總體而言,需要校驗(yàn)的信息如下:[0037](I)vermagic[0038]內(nèi)核驅(qū)動(dòng)采用的是ELF格式,vermagic在.modinfo區(qū)里,vermagic是內(nèi)核的版本信息,內(nèi)核會(huì)校驗(yàn)正在加載的驅(qū)動(dòng)的vermagic是否跟內(nèi)核本身的一致。如果不一致則拒絕驅(qū)動(dòng)的加載。[0039](2)module_layout(內(nèi)核版本3.0以上)或者struct_module(內(nèi)核版本2.6以上,3.0以下)的版本信息[0040]module_layout和struct_module的版本信息包含在—vers1ns區(qū)。3.0版本以上的內(nèi)核會(huì)檢查正在加載的內(nèi)核驅(qū)動(dòng)的module_layout的版本信息是否與內(nèi)核本身的一致。2.6以上、3.0以下版本的內(nèi)核會(huì)檢查正在加載的內(nèi)核驅(qū)動(dòng)的struct_module的版本信息是否與內(nèi)核本身的一致。如果不一致則拒絕驅(qū)動(dòng)的加載。[0041](3)內(nèi)核驅(qū)動(dòng)引用到的symbol(符號(hào))的版本信息[0042]一般情況下,內(nèi)核驅(qū)動(dòng)都會(huì)引用到內(nèi)核中導(dǎo)出的函數(shù)或者變量(即:Symbol),如果用到了,則會(huì)在內(nèi)核驅(qū)動(dòng)的—vers1ns區(qū)里面保存該函數(shù)或者變量的版本信息。在內(nèi)核驅(qū)動(dòng)加載的時(shí)候,內(nèi)核會(huì)對(duì)函數(shù)或者變量在—vers1ns區(qū)里面的版本信息與內(nèi)核里面保存的版本信息做對(duì)比,如果不一致則拒絕驅(qū)動(dòng)的加載。[0043]由于Linux的特性,加載內(nèi)核驅(qū)動(dòng)時(shí)會(huì)進(jìn)行上面描述的三種校驗(yàn),所以很難用一個(gè)內(nèi)核驅(qū)動(dòng)來適應(yīng)各種不同版本的Linux內(nèi)核。通常情況下,需要找到對(duì)應(yīng)版本的內(nèi)核代碼,然后把內(nèi)核驅(qū)動(dòng)與對(duì)應(yīng)的內(nèi)核代碼一起編譯,才能讓編譯出來的內(nèi)核驅(qū)動(dòng)能通過上面描述的三種校驗(yàn)。由于Linux內(nèi)核的版本非常多,所以無法做到一個(gè)內(nèi)核驅(qū)動(dòng)能支持所有版本的Linux內(nèi)核。[0044]本發(fā)明針對(duì)上述問題,提供一種加載Linux內(nèi)核驅(qū)動(dòng)的方法及裝置,能夠使同一個(gè)內(nèi)核驅(qū)動(dòng)加載到運(yùn)行著各種版本內(nèi)核的Linux設(shè)備上。具體的,本發(fā)明所要解決的問題是讓同一個(gè)內(nèi)核驅(qū)動(dòng)能加載到不同版本的Linux內(nèi)核中,而不受上面三種校驗(yàn)的限制。[0045]參見圖1,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的加載Linux內(nèi)核驅(qū)動(dòng)的方法流程圖,包括以下步驟:[0046]SlOl:選擇與目標(biāo)系統(tǒng)的CPU平臺(tái)一致的內(nèi)核代碼作為編譯初始通用內(nèi)核驅(qū)動(dòng)的參考內(nèi)核代碼;[0047]S102:在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié),并將填充后的參考內(nèi)核代碼與初始通用內(nèi)核驅(qū)動(dòng)一起編譯;[0048]S103:在目標(biāo)系統(tǒng)中查找目標(biāo)系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng),并根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng),生成通用內(nèi)核驅(qū)動(dòng);[0049]S104:將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0050]其中,目標(biāo)系統(tǒng)是一種運(yùn)行著Linux內(nèi)核的系統(tǒng),通用內(nèi)核驅(qū)動(dòng)需要加載到該系統(tǒng)中;參考內(nèi)核代碼是一份完整的內(nèi)核代碼,內(nèi)核驅(qū)動(dòng)的編譯需要用到該內(nèi)核代碼的版本信息、符號(hào)信息和頭文件等等,是編譯內(nèi)核驅(qū)動(dòng)必不可少的基礎(chǔ);初始通用內(nèi)核驅(qū)動(dòng)是基于標(biāo)準(zhǔn)Linux內(nèi)核源代碼編譯生成的,初始通用內(nèi)核驅(qū)動(dòng)是一種二進(jìn)制的ELF文件,初始通用內(nèi)核驅(qū)動(dòng)經(jīng)過本發(fā)明方法的處理后,稱之為通用內(nèi)核驅(qū)動(dòng),才能夠加載到不同版本的Linux內(nèi)核中;通用內(nèi)核驅(qū)動(dòng)是由初始通用內(nèi)核驅(qū)動(dòng)經(jīng)過根據(jù)參考內(nèi)核驅(qū)動(dòng)修改之后生成的,可以加載到不同版本的Linux內(nèi)核中。[0051]為了解決上述問題,針對(duì)內(nèi)核在驅(qū)動(dòng)加載時(shí)所作的校驗(yàn),本發(fā)明提供的方案的基本思路如下:在目標(biāo)系統(tǒng)中尋找系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng),根據(jù)參考驅(qū)動(dòng)的信息,修改初始通用內(nèi)核驅(qū)動(dòng),使之可以通過內(nèi)核的三種校驗(yàn),然后再通過正常的方法加載修改后的內(nèi)核驅(qū)動(dòng)。[0052]具體的步驟如下:[0053]步驟一:選擇與目標(biāo)系統(tǒng)的CPU平臺(tái)一致的內(nèi)核代碼,作為編譯初始通用內(nèi)核驅(qū)動(dòng)的參考內(nèi)核代碼。[0054]例如:如果是給Android(Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦)的ARM平臺(tái)的設(shè)備開發(fā)初始通用內(nèi)核驅(qū)動(dòng),則可以選擇google提供的goldfish(GoIdfish是一種虛擬的ARM處理器,在android的仿真環(huán)境中使用)內(nèi)核源代碼作為參考內(nèi)核代碼。再如,如果目標(biāo)系統(tǒng)是ubuntu(烏班圖,是一個(gè)以桌面應(yīng)用為主的Linux操作系統(tǒng)系統(tǒng)),則選擇ubuntu系統(tǒng)的內(nèi)核源代碼作為參考內(nèi)核代碼。[0055]步驟二:修改參考內(nèi)核代碼的include/linux/module.h文件中的structmodule結(jié)構(gòu)體,在最后面增加預(yù)定大小的字節(jié),例如增加256字節(jié)的填充。[0056]由于內(nèi)核版本的不一致,structmodule結(jié)構(gòu)體的大小可能會(huì)有變化,為了編譯出來的內(nèi)核驅(qū)動(dòng)可以使用不同的內(nèi)核版本,把structmodule結(jié)構(gòu)體增大256字節(jié),這樣內(nèi)核在使用本發(fā)明編譯出來的通用內(nèi)核驅(qū)動(dòng)就不會(huì)發(fā)生內(nèi)存越界的行為。[0057]步驟三:把參考內(nèi)核代碼與初始通用內(nèi)核驅(qū)動(dòng)一起編譯,把初始通用內(nèi)核驅(qū)動(dòng)拷貝到目標(biāo)系統(tǒng)中,通過代碼尋找系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng)。[0058]步驟四:從參考內(nèi)核驅(qū)動(dòng)中提取需要的信息,修改初始通用內(nèi)核驅(qū)動(dòng),具體流程如圖2所示。[0059]對(duì)圖2中的過程解釋如下。[0060]S201:讀取初始通用內(nèi)核驅(qū)動(dòng)。[0061]內(nèi)核驅(qū)動(dòng)采用的是ELF格式,為了方便修改,把整個(gè)ELF格式的驅(qū)動(dòng)讀入到內(nèi)存。[0062]S202:在文件系統(tǒng)中搜索參考驅(qū)動(dòng)。[0063]在目標(biāo)系統(tǒng)的文件系統(tǒng)中搜索自帶的原生的驅(qū)動(dòng),找到后可以從里面提取信息,以供修改初始通用內(nèi)核驅(qū)動(dòng)。[0064]S203:判斷參考驅(qū)動(dòng)中是否包含.rel.gnu.linkonce.this_module區(qū)。[0065]通常的驅(qū)動(dòng)只要一旦加載進(jìn)入內(nèi)核就會(huì)執(zhí)行驅(qū)動(dòng)的init函數(shù)(加載執(zhí)行函數(shù)),一旦被卸載就會(huì)執(zhí)行驅(qū)動(dòng)的exit函數(shù)(卸載執(zhí)行函數(shù)),this_module結(jié)構(gòu)體中的init和exit成員存著這兩個(gè)函數(shù)的地址,由于驅(qū)動(dòng)加載的地址不確定,所以這兩個(gè)函數(shù)的地址在加載之前是未知的,需要在加載完后重新賦值這兩個(gè)結(jié)構(gòu)體的成員,這就是重定位。.rel.gnu.linkonce.this_module區(qū)中存著的就是this_module中需要重定位的信息,就是init和exit兩個(gè)成員的重定位信息。有的內(nèi)核驅(qū)動(dòng)并沒有init和exit函數(shù),可能只是導(dǎo)出一些函數(shù)供其它驅(qū)動(dòng)調(diào)用,這種驅(qū)動(dòng)不能作為參考驅(qū)動(dòng)。[0066]S204:讀取參考驅(qū)動(dòng)。[0067]把參考驅(qū)動(dòng)的整個(gè)內(nèi)容讀入內(nèi)存,方便信息的提取。[0068]S205:從參考驅(qū)動(dòng)的.modinfo區(qū)拷貝vermagic信息到初始通用內(nèi)核驅(qū)動(dòng)的.modinfo區(qū)的vermagic字段。[0069]由于內(nèi)核會(huì)在驅(qū)動(dòng)加載的時(shí)候驗(yàn)證vermagic,而參考驅(qū)動(dòng)的vermagic是正確的,所以把vermagic復(fù)制到初始通用內(nèi)核驅(qū)動(dòng)。[0070]S206:用參考驅(qū)動(dòng)的_vers1ns區(qū)開始的64字節(jié)覆蓋初始通用內(nèi)核驅(qū)動(dòng)_ver1ns區(qū)開始64字節(jié)。[0071]_vers1n區(qū)的每一項(xiàng)占64字節(jié),前面4個(gè)字節(jié)是版本信息,后面60個(gè)字節(jié)是函數(shù)或者變量的名字,由于2.6和3.0內(nèi)核中的第一項(xiàng)分別是struct_module和module_layout,所以不管目標(biāo)系統(tǒng)是什么版本,只需要把前64個(gè)字節(jié)拷貝到初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的位置,就可以通過內(nèi)核的檢驗(yàn),包括對(duì)驅(qū)動(dòng)版本的驗(yàn)證以及對(duì)需要使用到的符號(hào)的驗(yàn)證。[0072]S207:判斷參考驅(qū)動(dòng)與初始通用內(nèi)核驅(qū)動(dòng)的.rel.gnu.linkonce.this_module區(qū)大小是否一致。[0073]增加這個(gè)判斷是防止參考驅(qū)動(dòng)中的this_module中有更多的需要重定位的成員,這樣可能會(huì)會(huì)導(dǎo)致init和exit成員的偏移不正確,導(dǎo)致內(nèi)核加載出錯(cuò),甚至內(nèi)核崩潰。[0074]S208:如果參考驅(qū)動(dòng)與初始通用內(nèi)核驅(qū)動(dòng)的.rel.gnu.linkonce.this_module區(qū)大小一致,則拷貝參考驅(qū)動(dòng)的.rel.gnu.linkonce.this_module到初始通用內(nèi)核驅(qū)動(dòng)的.rel.gnu.linkonce.this_module。[0075]復(fù)制this_module.1nit和this_module.exit的重定位信息到初始通用內(nèi)核驅(qū)動(dòng)中,初始通用內(nèi)核驅(qū)動(dòng)的this_module結(jié)構(gòu)體在編譯的時(shí)候由于增加了預(yù)定大小字節(jié)(例如256字節(jié))的填充,所以肯定比目標(biāo)系統(tǒng)中的this_module的結(jié)構(gòu)體要大,這樣init和exit的重定位信息中的偏移量肯定不會(huì)超出初始通用內(nèi)核驅(qū)動(dòng)的this_module結(jié)構(gòu)體。在驅(qū)動(dòng)加載時(shí),內(nèi)核根據(jù)重定位信息把init和exit函數(shù)加載后的地址賦值到this_module.1nit和this_module.exit,然后再調(diào)用this_module.1nit指向的函數(shù)。這樣整個(gè)驅(qū)動(dòng)就算加載成功了。[0076]S209:生成新的通用內(nèi)核驅(qū)動(dòng)。[0077]把內(nèi)存中的通用內(nèi)核驅(qū)動(dòng)寫入到文件中,以供insmod加載。[0078]上述是圖2的流程,完成之后,就得到了通用內(nèi)核驅(qū)動(dòng)。[0079]步驟五:通過傳統(tǒng)的insmod命令將修改后的通用內(nèi)核驅(qū)動(dòng)加載進(jìn)目標(biāo)系統(tǒng)的內(nèi)核。[0080]上述技術(shù)方案僅僅是示例,一些方面可以做適當(dāng)調(diào)整,比如:[0081]步驟一中,參考內(nèi)核代碼的選擇可以有很多種,只要選擇與目標(biāo)系統(tǒng)的CPU的架構(gòu)是一樣的系統(tǒng)內(nèi)核源代碼即可。[0082]步驟二中,module結(jié)構(gòu)體最后的填充256字節(jié),可以用其它數(shù)值,只要確保修改后的參考內(nèi)核代碼中的module結(jié)構(gòu)體大小,大于目標(biāo)系統(tǒng)的module結(jié)構(gòu)體大小。[0083]步驟三中,編譯初始通用內(nèi)核驅(qū)動(dòng)時(shí)可以放在參考內(nèi)核代碼內(nèi)部一起編譯,也可以放在外面單獨(dú)編譯。[0084]步驟四中,根據(jù)參考驅(qū)動(dòng)修改初始通用內(nèi)核驅(qū)動(dòng)的行為,可以放在目標(biāo)系統(tǒng)上執(zhí)行,也可以把目標(biāo)系統(tǒng)上的參考驅(qū)動(dòng)拷貝到其它機(jī)器上執(zhí)行;修改初始通用內(nèi)核驅(qū)動(dòng)的步驟可以做一些順序上的調(diào)整,甚至最后一步不需要寫入文件,直接用內(nèi)存中的通用內(nèi)核驅(qū)動(dòng),調(diào)用initjnodule系統(tǒng)調(diào)用,把修改過的驅(qū)動(dòng)加載到內(nèi)核中,這樣步驟五就不需要了。[0085]可見,在上述詳細(xì)過程中,拷貝參考驅(qū)動(dòng)的vermagic信息到初始通用內(nèi)核驅(qū)動(dòng),就可以通過內(nèi)核對(duì)vermagic的校驗(yàn);復(fù)制參考驅(qū)動(dòng)—vers1ns區(qū)的前64個(gè)字節(jié)到初始通用內(nèi)核驅(qū)動(dòng)的—ver1ns區(qū),就可以通過內(nèi)核對(duì)struct_module或者module_layout的驅(qū)動(dòng)版本信息的校驗(yàn)以及符號(hào)的校驗(yàn);復(fù)制.rel.gnu.linkonce.this_module區(qū),就可以讓內(nèi)核重定位this_module.1ni和this_module.exit到正確的問題,讓驅(qū)動(dòng)init函數(shù)得到正確的調(diào)用。總之,采用本發(fā)明的技術(shù)方案,就可以把一個(gè)通用內(nèi)核驅(qū)動(dòng)加載到不同內(nèi)核版本的目標(biāo)系統(tǒng)中去。實(shí)際操作中,可以把同一個(gè)驅(qū)動(dòng)加載到大部分的Android手機(jī)里。[0086]與上述方法相對(duì)應(yīng),本發(fā)明還提供一種加載Linux內(nèi)核驅(qū)動(dòng)的裝置。該裝置可以通過硬件、軟件或軟硬件結(jié)合方式實(shí)現(xiàn)。該裝置可以是指Linux系統(tǒng)的功能模塊,也可以是指安裝Linux系統(tǒng)的硬件設(shè)備,只要可實(shí)現(xiàn)該裝置的功能即可。[0087]圖3示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的加載Linux內(nèi)核驅(qū)動(dòng)的裝置,包括:[0088]參考內(nèi)核代碼選擇單元301,用于選擇與目標(biāo)系統(tǒng)的CPU平臺(tái)一致的內(nèi)核代碼作為編譯初始通用內(nèi)核驅(qū)動(dòng)的參考內(nèi)核代碼;[0089]初始通用內(nèi)核代碼編譯單元302,用于在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié),并將填充后的參考內(nèi)核代碼與初始通用內(nèi)核驅(qū)動(dòng)一起編譯;[0090]通用內(nèi)核驅(qū)動(dòng)生成單元303,用于在目標(biāo)系統(tǒng)中查找目標(biāo)系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng),并根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng),生成通用內(nèi)核驅(qū)動(dòng);[0091]通用內(nèi)核驅(qū)動(dòng)加載單元304,用于將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0092]優(yōu)選的,所述初始通用內(nèi)核代碼編譯單元302具體用于:修改參考內(nèi)核代碼的include/linux/module.h文件中的structmodule結(jié)構(gòu)體,在結(jié)構(gòu)體尾部填充預(yù)定大小的字節(jié)。[0093]優(yōu)選的,所述初始通用內(nèi)核代碼編譯單元302所填充預(yù)定大小的字節(jié),保證經(jīng)過填充后的參考內(nèi)核代碼的structmodule結(jié)構(gòu)體大于目標(biāo)系統(tǒng)的structmodule結(jié)構(gòu)體。[0094]優(yōu)選的,所述通用內(nèi)核驅(qū)動(dòng)生成單元303具體用于:從所述參考驅(qū)動(dòng)中提取內(nèi)核校驗(yàn)需要使用到的校驗(yàn)信息;以及,根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息。[0095]優(yōu)選的,所述校驗(yàn)信息是指內(nèi)核版本信息:vermagic信息;所述通用內(nèi)核驅(qū)動(dòng)生成單元303具體用于:將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段。[0096]優(yōu)選的,所述校驗(yàn)信息是指內(nèi)核驅(qū)動(dòng)版本信息以及所使用的導(dǎo)出符號(hào)的版本信息:vers1ns區(qū)開始64字節(jié);所述通用內(nèi)核驅(qū)動(dòng)生成單元303具體用于:用所述參考驅(qū)動(dòng)的.vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)。[0097]優(yōu)選的,所述通用內(nèi)核驅(qū)動(dòng)生成單元303具體用于:從所述參考驅(qū)動(dòng)中提取加載執(zhí)行函數(shù)和卸載執(zhí)行函數(shù)的重定位信息;以及,根據(jù)從參考驅(qū)動(dòng)中提取的所述重定位信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息。[0098]優(yōu)選的,所述重定位信息是指this_module.1nit和this_mosule.exit的重定位信息;所述通用內(nèi)核驅(qū)動(dòng)生成單元303具體用于:將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。[0099]優(yōu)選的,所述通用內(nèi)核驅(qū)動(dòng)生成單元303具體用于:判斷所述參考驅(qū)動(dòng)中是否包含rel.gnu.linkonce.this_module區(qū);若否,在文件系統(tǒng)中搜索包含rel.gnu.linkonce.this_module區(qū)的參考驅(qū)動(dòng);若是,首先將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段,然后用所述參考驅(qū)動(dòng)的.vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié),最后判斷參考驅(qū)動(dòng)與初始通用內(nèi)核驅(qū)動(dòng)的rel.gnu.linkonce.this_module區(qū)大小是否一致,如果一致,將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。[0100]優(yōu)選的,所述通用內(nèi)核驅(qū)動(dòng)加載單元304具體用于:將通用內(nèi)核驅(qū)動(dòng)寫入文件中,通過insmod命令將通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中;或者,利用內(nèi)存中的通用內(nèi)核驅(qū)動(dòng)調(diào)用init_module系統(tǒng)調(diào)用,將所述通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0101]優(yōu)選的,所述初始通用內(nèi)核驅(qū)動(dòng)是基于標(biāo)準(zhǔn)Linux內(nèi)核源代碼編譯生成的。[0102]優(yōu)選的,如果所述目標(biāo)系統(tǒng)是android系統(tǒng),則所述參考內(nèi)核代碼選擇單元301選擇android系統(tǒng)的內(nèi)核源代碼作為所述參考內(nèi)核代碼;如果所述目標(biāo)系統(tǒng)是ubuntu系統(tǒng),則所述參考內(nèi)核代碼選擇單元301選擇ubuntu系統(tǒng)的內(nèi)核源代碼作為所述參考內(nèi)核代碼。[0103]在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對(duì)任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。[0104]在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說明書的理解。[0105]類似地,應(yīng)當(dāng)理解,為了精簡(jiǎn)本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循【具體實(shí)施方式】的權(quán)利要求書由此明確地并入該【具體實(shí)施方式】,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。[0106]本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。[0107]此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。[0108]本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的加載Linux內(nèi)核驅(qū)動(dòng)的裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。[0109]應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過同一個(gè)硬件項(xiàng)來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。[0110]本發(fā)明提供如下方案:[0111]Al、一種加載Linux內(nèi)核驅(qū)動(dòng)的方法,包括:[0112]選擇與目標(biāo)系統(tǒng)的CPU平臺(tái)一致的內(nèi)核代碼作為編譯初始通用內(nèi)核驅(qū)動(dòng)的參考內(nèi)核代碼;[0113]在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié),并將填充后的參考內(nèi)核代碼與初始通用內(nèi)核驅(qū)動(dòng)一起編譯;[0114]在目標(biāo)系統(tǒng)中查找目標(biāo)系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng),并根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng),生成通用內(nèi)核驅(qū)動(dòng);[0115]將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0116]A2、如Al所述的方法,所述在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié)包括:[0117]修改參考內(nèi)核代碼的include/linux/module.h文件中的structmodule結(jié)構(gòu)體,在結(jié)構(gòu)體尾部填充預(yù)定大小的字節(jié)。[0118]A3、如A2所述的方法,所述填充預(yù)定大小的字節(jié),保證經(jīng)過填充后的參考內(nèi)核代碼的structmodule結(jié)構(gòu)體大于目標(biāo)系統(tǒng)的structmodule結(jié)構(gòu)體。[0119]A4、如Al所述的方法,所述根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng)包括:[0120]從所述參考驅(qū)動(dòng)中提取內(nèi)核校驗(yàn)需要使用到的校驗(yàn)信息;[0121]根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信肩、O[0122]A5、如A4所述的方法,所述校驗(yàn)信息是指內(nèi)核版本信息:vermagic信息;[0123]所述根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息包括:[0124]將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段。[0125]A6、如A4所述的方法,所述校驗(yàn)信息是指內(nèi)核驅(qū)動(dòng)版本信息以及所使用的導(dǎo)出符號(hào)的版本信息vers1ns區(qū)開始64字節(jié);[0126]所述根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息包括:[0127]用所述參考驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)。[0128]A7、如Al所述的方法,所述根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng)包括:[0129]從所述參考驅(qū)動(dòng)中提取加載執(zhí)行函數(shù)和卸載執(zhí)行函數(shù)的重定位信息;[0130]根據(jù)從參考驅(qū)動(dòng)中提取的所述重定位信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息。[0131]A8、如A7所述的方法,所述重定位信息是指this_module.1nit和this_mosule.exit的重定位信息;[0132]所述根據(jù)從參考驅(qū)動(dòng)中提取的所述重定位信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息包括:[0133]將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。[0134]A9、如Al所述的方法,所述根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng)包括:[0135]判斷所述參考驅(qū)動(dòng)中是否包含rel.gnu.linkonce.this_module區(qū);[0136]若否,在文件系統(tǒng)中搜索包含rel.gnu.linkonce.this_module區(qū)的參考驅(qū)動(dòng);[0137]若是,首先將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段,然后用所述參考驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的.vers1ns區(qū)開始64字節(jié),最后判斷參考驅(qū)動(dòng)與初始通用內(nèi)核驅(qū)動(dòng)的rel.gnu.linkonce.this_module區(qū)大小是否一致,如果一致,將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。[0138]AlO^nAl所述的方法,將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中包括:[0139]將通用內(nèi)核驅(qū)動(dòng)寫入文件中,通過insmod命令將通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中;或者,[0140]利用內(nèi)存中的通用內(nèi)核驅(qū)動(dòng)調(diào)用init_module系統(tǒng)調(diào)用,將所述通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0141]AU、如Al所述的方法,所述初始通用內(nèi)核驅(qū)動(dòng)是基于標(biāo)準(zhǔn)Linux內(nèi)核源代碼編譯生成的。[0142]A12、如Al所述的方法,如果所述目標(biāo)系統(tǒng)是android系統(tǒng),則選擇android系統(tǒng)的內(nèi)核源代碼作為所述參考內(nèi)核代碼;如果所述目標(biāo)系統(tǒng)是ubuntu系統(tǒng),則選擇ubuntu系統(tǒng)的內(nèi)核源代碼作為所述參考內(nèi)核代碼。[0143]B13、一種加載Linux內(nèi)核驅(qū)動(dòng)的裝置,包括:[0144]參考內(nèi)核代碼選擇單元,用于選擇與目標(biāo)系統(tǒng)的CPU平臺(tái)一致的內(nèi)核代碼作為編譯初始通用內(nèi)核驅(qū)動(dòng)的參考內(nèi)核代碼;[0145]初始通用內(nèi)核代碼編譯單元,用于在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié),并將填充后的參考內(nèi)核代碼與初始通用內(nèi)核驅(qū)動(dòng)一起編譯;[0146]通用內(nèi)核驅(qū)動(dòng)生成單元,用于在目標(biāo)系統(tǒng)中查找目標(biāo)系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng),并根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng),生成通用內(nèi)核驅(qū)動(dòng);[0147]通用內(nèi)核驅(qū)動(dòng)加載單元,用于將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0148]B14、如B3所述的裝置,所述初始通用內(nèi)核代碼編譯單元具體用于:修改參考內(nèi)核代碼的include/linux/module.h文件中的structmodule結(jié)構(gòu)體,在結(jié)構(gòu)體尾部填充預(yù)定大小的字節(jié)。[0149]B15、如B14所述的裝置,所述初始通用內(nèi)核代碼編譯單元所填充預(yù)定大小的字節(jié),保證經(jīng)過填充后的參考內(nèi)核代碼的structmodule結(jié)構(gòu)體大于目標(biāo)系統(tǒng)的structmodule結(jié)構(gòu)體。[0150]B16、如B13所述的裝置,所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:從所述參考驅(qū)動(dòng)中提取內(nèi)核校驗(yàn)需要使用到的校驗(yàn)信息;以及,根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息。[0151]B17、如B16所述的裝置,所述校驗(yàn)信息是指內(nèi)核版本信息:vermagic信息;所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段。[0152]B16所述的裝置,所述校驗(yàn)信息是指內(nèi)核驅(qū)動(dòng)版本信息以及所使用的導(dǎo)出符號(hào)的版本信息vers1ns區(qū)開始64字節(jié);所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:用所述參考驅(qū)動(dòng)的.vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)。[0153]B19、如B13所述的裝置,所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:從所述參考驅(qū)動(dòng)中提取加載執(zhí)行函數(shù)和卸載執(zhí)行函數(shù)的重定位信息;以及,根據(jù)從參考驅(qū)動(dòng)中提取的所述重定位信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息。[0154]B20、如B19所述的裝置,所述重定位信息是指this_module.1nit和this_mosule.exit的重定位信息;所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。[0155]B21、如B13所述的裝置,所述通用內(nèi)核驅(qū)動(dòng)生成單元具體用于:判斷所述參考驅(qū)動(dòng)中是否包含rel.gnu.linkonce.this_module區(qū);若否,在文件系統(tǒng)中搜索包含rel.gnu.linkonce.this_module區(qū)的參考驅(qū)動(dòng);若是,首先將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段,然后用所述參考驅(qū)動(dòng)的.vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié),最后判斷參考驅(qū)動(dòng)與初始通用內(nèi)核驅(qū)動(dòng)的rel.gnu.linkonce.this_module區(qū)大小是否一致,如果一致,將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。[0156]B22、如B13所述的裝置,所述通用內(nèi)核驅(qū)動(dòng)加載單元具體用于:將通用內(nèi)核驅(qū)動(dòng)寫入文件中,通過insmod命令將通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中;或者,利用內(nèi)存中的通用內(nèi)核驅(qū)動(dòng)調(diào)用init_module系統(tǒng)調(diào)用,將所述通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。[0157]B23、如B13所述的裝置,所述初始通用內(nèi)核驅(qū)動(dòng)是基于標(biāo)準(zhǔn)Linux內(nèi)核源代碼編譯生成的。[0158]B24、如B13所述的裝置,如果所述目標(biāo)系統(tǒng)是android系統(tǒng),則所述參考內(nèi)核代碼選擇單元選擇android系統(tǒng)的內(nèi)核源代碼作為所述參考內(nèi)核代碼;如果所述目標(biāo)系統(tǒng)是ubuntu系統(tǒng),則所述參考內(nèi)核代碼選擇單元選擇ubuntu系統(tǒng)的內(nèi)核源代碼作為所述參考內(nèi)核代碼?!緳?quán)利要求】1.一種加載Linux內(nèi)核驅(qū)動(dòng)的方法,其特征在于,包括:選擇與目標(biāo)系統(tǒng)的CPU平臺(tái)一致的內(nèi)核代碼作為編譯初始通用內(nèi)核驅(qū)動(dòng)的參考內(nèi)核代碼;在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié),并將填充后的參考內(nèi)核代碼與初始通用內(nèi)核驅(qū)動(dòng)一起編譯;在目標(biāo)系統(tǒng)中查找目標(biāo)系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng),并根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng),生成通用內(nèi)核驅(qū)動(dòng);將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中。2.如權(quán)利要求1所述的方法,其特征在于,所述在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié)包括:修改參考內(nèi)核代碼的include/linux/module,h文件中的structmodule結(jié)構(gòu)體,在結(jié)構(gòu)體尾部填充預(yù)定大小的字節(jié)。3.如權(quán)利要求2所述的方法,其特征在于,所述填充預(yù)定大小的字節(jié),保證經(jīng)過填充后的參考內(nèi)核代碼的structmodule結(jié)構(gòu)體大于目標(biāo)系統(tǒng)的structmodule結(jié)構(gòu)體。4.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng)包括:從所述參考驅(qū)動(dòng)中提取內(nèi)核校驗(yàn)需要使用到的校驗(yàn)信息;根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息。5.如權(quán)利要求4所述的方法,其特征在于,所述校驗(yàn)信息是指內(nèi)核版本信息:vermagic信息;所述根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息包括:將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段。6.如權(quán)利要求4所述的方法,其特征在于,所述校驗(yàn)信息是指內(nèi)核驅(qū)動(dòng)版本信息以及所使用的導(dǎo)出符號(hào)的版本信息:vers1ns區(qū)開始64字節(jié);所述根據(jù)從參考驅(qū)動(dòng)中提取的所述校驗(yàn)信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息包括:用所述參考驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)。7.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng)包括:從所述參考驅(qū)動(dòng)中提取加載執(zhí)行函數(shù)和卸載執(zhí)行函數(shù)的重定位信息;根據(jù)從參考驅(qū)動(dòng)中提取的所述重定位信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信肩、O8.如權(quán)利要求7所述的方法,其特征在于,所述重定位信息是指this_module.1nit和this_mosule.exit的重定位信息;所述根據(jù)從參考驅(qū)動(dòng)中提取的所述重定位信息,修改所述初始通用內(nèi)核驅(qū)動(dòng)中對(duì)應(yīng)的信息包括:將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。9.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng)包括:判斷所述參考驅(qū)動(dòng)中是否包含rel.gnu.linkonce.this_module區(qū);若否,在文件系統(tǒng)中搜索包含rel.gnu.linkonce.this_module區(qū)的參考驅(qū)動(dòng);若是,首先將參考驅(qū)動(dòng)的modinfo區(qū)的vermagic信息拷貝到初始通用內(nèi)核驅(qū)動(dòng)的modinfo區(qū)的vermagic字段,然后用所述參考驅(qū)動(dòng)的vers1ns區(qū)開始64字節(jié)覆蓋所述初始通用內(nèi)核驅(qū)動(dòng)的.vers1ns區(qū)開始64字節(jié),最后判斷參考驅(qū)動(dòng)與初始通用內(nèi)核驅(qū)動(dòng)的rel.gnu.linkonce.this_module區(qū)大小是否一致,如果一致,將所述參考驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)的內(nèi)容拷貝到所述初始通用內(nèi)核驅(qū)動(dòng)中的rel.gnu.linkonce.this_module區(qū)。10.一種加載Linux內(nèi)核驅(qū)動(dòng)的裝置,其特征在于,包括:參考內(nèi)核代碼選擇單元,用于選擇與目標(biāo)系統(tǒng)的CPU平臺(tái)一致的內(nèi)核代碼作為編譯初始通用內(nèi)核驅(qū)動(dòng)的參考內(nèi)核代碼;初始通用內(nèi)核代碼編譯單元,用于在參考內(nèi)核代碼的結(jié)構(gòu)體中填充預(yù)定大小的字節(jié),并將填充后的參考內(nèi)核代碼與初始通用內(nèi)核驅(qū)動(dòng)一起編譯;通用內(nèi)核驅(qū)動(dòng)生成單元,用于在目標(biāo)系統(tǒng)中查找目標(biāo)系統(tǒng)自帶的內(nèi)核驅(qū)動(dòng)作為參考驅(qū)動(dòng),并根據(jù)參考驅(qū)動(dòng)的信息修改上述經(jīng)過編譯后的初始通用內(nèi)核驅(qū)動(dòng),生成通用內(nèi)核驅(qū)動(dòng);通用內(nèi)核驅(qū)動(dòng)加載單元,用于將生成的通用內(nèi)核驅(qū)動(dòng)加載到目標(biāo)系統(tǒng)的內(nèi)核中?!疚臋n編號(hào)】G06F9/445GK104375874SQ201410766160【公開日】2015年2月25日申請(qǐng)日期:2014年12月11日優(yōu)先權(quán)日:2014年12月11日【發(fā)明者】陳章琪申請(qǐng)人:北京奇虎科技有限公司,奇智軟件(北京)有限公司