亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

在Linux驅(qū)動中綁定內(nèi)核符號的方法及裝置制造方法

文檔序號:6638464閱讀:156來源:國知局
在Linux驅(qū)動中綁定內(nèi)核符號的方法及裝置制造方法【專利摘要】本發(fā)明公開了一種在Linux驅(qū)動中綁定內(nèi)核符號的方法及裝置,其中的方法包括:在驅(qū)動中為每一個需要用到的內(nèi)核符號定義一個指針;在驅(qū)動初始化時,查找內(nèi)核符號表,并通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號;將從內(nèi)核中查找到的各個內(nèi)核符號的地址賦值給所述驅(qū)動定義的各個內(nèi)核符號對應(yīng)的指針;在驅(qū)動中通過指針的方式訪問內(nèi)核符號。采用本發(fā)明的技術(shù)方案,可以開發(fā)出一個在不同版本內(nèi)核中通用的驅(qū)動,不用在不同版本內(nèi)核的源碼下分別編譯,減少開發(fā)的工作量以及適配的工作量?!緦@f明】在Linux驅(qū)動中綁定內(nèi)核符號的方法及裝置【
技術(shù)領(lǐng)域
】[0001]本發(fā)明涉及計算機【
技術(shù)領(lǐng)域
】,具體涉及一種在Linux驅(qū)動中綁定內(nèi)核符號的方法及裝置?!?br>背景技術(shù)
】[0002]Linux驅(qū)動要能正常工作起來,需要訪問內(nèi)核提供的符號(symbol,是指內(nèi)核中導(dǎo)出的函數(shù)或者變量),這些symbol的地址在驅(qū)動編譯的時候并不是寫死在驅(qū)動中的,需要在驅(qū)動加載的時候重新定位并賦值,編譯的時候只是會記錄下需要用到的符號,以及重定位信息。[0003]Linux驅(qū)動依賴的這種symbol就是內(nèi)核導(dǎo)出的函數(shù)或者全局變量。Linux驅(qū)動的編譯需要內(nèi)核的頭文件以及symbol信息,并把需要用到的symbol重定位信息、版本信息存在驅(qū)動文件的ELF格式(ExecutableandLinkableFormat,可執(zhí)行連接格式)中。等到Linux驅(qū)動加載的時候,內(nèi)核才會對這些symbol進行重定位;但在重定位前,需要對symbol的版本信息進行驗證,如果Linux驅(qū)動中記錄的版本信息與內(nèi)核中記錄的版本信息不一致,內(nèi)核會拒絕加載該驅(qū)動。[0004]因此,為了讓同一個驅(qū)動能夠在不同的設(shè)備上加載并正常工作,需要獲得不同設(shè)備的內(nèi)核代碼,并把驅(qū)動與內(nèi)核代碼一起進行編譯。這樣一來驅(qū)動開發(fā)的工作量將是巨大的,由于有的設(shè)備的內(nèi)核代碼無法獲得,變成了不可能的任務(wù)。【
發(fā)明內(nèi)容】[0005]鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的一種在Linux驅(qū)動中綁定內(nèi)核符號的方法及裝置。[0006]依據(jù)本發(fā)明的一個方面,提供一種在Linux驅(qū)動中綁定內(nèi)核符號的方法,包括:在驅(qū)動中為每一個需要用到的內(nèi)核符號定義一個指針;在驅(qū)動初始化時,查找內(nèi)核符號表,并通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號;將從內(nèi)核中查找到的各個內(nèi)核符號的地址賦值給所述驅(qū)動定義的各個內(nèi)核符號對應(yīng)的指針;在驅(qū)動中通過指針的方式訪問內(nèi)核符號。[0007]優(yōu)選的,所述查找內(nèi)核符號表包括:從內(nèi)核地址空間的起始位置開始,設(shè)定預(yù)定大小的搜索區(qū)域;從所述搜索區(qū)域開始查找,判斷連續(xù)預(yù)定數(shù)量符號的符號名是否為字符串;如果是,則確定所述搜索區(qū)域是內(nèi)核符號表所在位置;如果否,則從上次所述搜索區(qū)域結(jié)束位置開始以所述預(yù)定大小的搜索區(qū)域重新搜索。[0008]優(yōu)選的,還包括:在內(nèi)核地址空間搜索是否存在所述預(yù)定大小的搜索區(qū)域,其中,所述預(yù)定大小的搜索區(qū)域是連續(xù)多于512個字的區(qū)域。[0009]優(yōu)選的,所述預(yù)定數(shù)量符號是指大于3并小于512的數(shù)目的符號。[0010]優(yōu)選的,所述通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號包括:判斷內(nèi)核符號表中的符號是否經(jīng)過排序的;如果符號是經(jīng)過排序的,根據(jù)符號名字按照二分查找算法查找出所述驅(qū)動需要用到的內(nèi)核符號;如果符號不是經(jīng)過排序的,在內(nèi)核符號表中從頭至尾按照符號名查找出所述驅(qū)動需要用到的內(nèi)核符號。[0011]優(yōu)選的,還包括:在查找到內(nèi)核符號表之后,首先查找內(nèi)核中是否存在內(nèi)核符號查找函數(shù);如果存在所述內(nèi)核符號查找函數(shù),則利用所述內(nèi)核符號查找函數(shù)查找出所述驅(qū)動需要用到的內(nèi)核符號;否則,才執(zhí)行所述判斷內(nèi)核符號表是否經(jīng)過排序以及按照二分查找算法或直接按照符號名字查找出所述驅(qū)動需要用到的內(nèi)核符號的步驟。[0012]優(yōu)選的,所述判斷內(nèi)核符號表中的符號是否經(jīng)過排序的包括:從內(nèi)核符號表開始位置A,找到第一個不是按照符號名遞增排序的符號的位置FA;從FA開始到內(nèi)核符號表結(jié)束位置B,判斷符號是否按照符號名遞增排序的;如果是,則確定內(nèi)核符號表是經(jīng)過排序的,其中,所述內(nèi)核符號表包括兩個,第一個內(nèi)核符號表的位置是從A至FA-1,第二個內(nèi)核符號表的位置是從FA至B;否則,則確定內(nèi)核符號表不是經(jīng)過排序的。[0013]優(yōu)選的,所述第一個內(nèi)核符號表是指ksymtab符號表,所述第二個內(nèi)核符號表是指ksymtab_gpl符號表。[0014]依據(jù)本發(fā)明的另一個方面,提供一種在Linux驅(qū)動中綁定內(nèi)核符號的裝置,包括:指針定義單元,用于在驅(qū)動中為每一個需要用到的內(nèi)核符號定義一個指針;內(nèi)核符號表查找單兀,用于在驅(qū)動初始化時,查找內(nèi)核符號表;內(nèi)核符號查找單兀,用于在驅(qū)動初始化時,通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號;指針賦值單元,用于在驅(qū)動初始化時,將從內(nèi)核中查找到的各個內(nèi)核符號的地址賦值給所述驅(qū)動定義的各個內(nèi)核符號對應(yīng)的指針;內(nèi)核符號訪問單元,用于在驅(qū)動中通過指針的方式訪問內(nèi)核符號。[0015]優(yōu)選的,所述內(nèi)核符號表查找單元具體用于:從內(nèi)核地址空間的起始位置開始,設(shè)定預(yù)定大小的搜索區(qū)域;從所述搜索區(qū)域開始查找,判斷連續(xù)預(yù)定數(shù)量符號的符號名是否為字符串;如果是,則確定所述搜索區(qū)域是內(nèi)核符號表所在位置;如果否,則從上次所述搜索區(qū)域結(jié)束位置開始以所述預(yù)定大小的搜索區(qū)域重新搜索。[0016]優(yōu)選的,所述內(nèi)核符號表查找單元還用于:在內(nèi)核地址空間搜索是否存在所述預(yù)定大小的搜索區(qū)域,其中,所述預(yù)定大小的搜索區(qū)域是連續(xù)多于512個字的區(qū)域。[0017]優(yōu)選的,所述預(yù)定數(shù)量符號是指大于3并小于512的數(shù)目的符號。[0018]優(yōu)選的,所述內(nèi)核符號查找單元具體用于:判斷內(nèi)核符號表中的符號是否經(jīng)過排序的;如果符號是經(jīng)過排序的,根據(jù)符號名字按照二分查找算法查找出所述驅(qū)動需要用到的內(nèi)核符號;如果符號不是經(jīng)過排序的,在內(nèi)核符號表中從頭至尾按照符號名查找出所述驅(qū)動需要用到的內(nèi)核符號。[0019]優(yōu)選的,所述內(nèi)核符號查找單元還用于:在查找到內(nèi)核符號表之后,首先查找內(nèi)核中是否存在內(nèi)核符號查找函數(shù);如果存在所述內(nèi)核符號查找函數(shù),則利用所述內(nèi)核符號查找函數(shù)查找出所述驅(qū)動需要用到的內(nèi)核符號;否則,才執(zhí)行所述判斷內(nèi)核符號表是否經(jīng)過排序以及按照二分查找算法或直接按照符號名字查找出所述驅(qū)動需要用到的內(nèi)核符號的步驟。[0020]優(yōu)選的,所述內(nèi)核符號查找單元還用于:從內(nèi)核符號表開始位置A,找到第一個不是按照符號名遞增排序的符號的位置FA;從FA開始到內(nèi)核符號表結(jié)束位置B,判斷符號是否按照符號名遞增排序的;如果是,則確定內(nèi)核符號表是經(jīng)過排序的,其中,所述內(nèi)核符號表包括兩個,第一個內(nèi)核符號表的位置是從A至FA-1,第二個內(nèi)核符號表的位置是從FA至B;否則,則確定內(nèi)核符號表不是經(jīng)過排序的。[0021]優(yōu)選的,所述第一個內(nèi)核符號表是指ksymtab符號表,所述第二個內(nèi)核符號表是指ksymtab_gpl符號表。[0022]可見,采用本發(fā)明的技術(shù)方案,通過在驅(qū)動初始化時查找內(nèi)核符號表,并通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號,并將各個內(nèi)核符號的地址賦值給驅(qū)動預(yù)先定義的各個內(nèi)核符號對應(yīng)的指針,從而可以在驅(qū)動中通過指針的方式訪問內(nèi)核符號。采用本發(fā)明的技術(shù)方案,可以開發(fā)出一個在不同版本內(nèi)核中通用的驅(qū)動,不用在不同版本內(nèi)核的源碼下分別編譯,減少開發(fā)的工作量以及適配的工作量。[0023]上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的【具體實施方式】。【專利附圖】【附圖說明】[0024]通過閱讀下文優(yōu)選實施方式的詳細描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:[0025]圖1示出了根據(jù)本發(fā)明一個實施例的在Linux驅(qū)動中綁定內(nèi)核符號的方法流程圖;[0026]圖2示出了根據(jù)本發(fā)明一個實施例的搜索內(nèi)核符號表的流程圖;以及[0027]圖3示出了根據(jù)本發(fā)明一個實施例的在Linux驅(qū)動中綁定內(nèi)核符號的裝置結(jié)構(gòu)示意圖?!揪唧w實施方式】[0028]下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應(yīng)當理解,可以以各種形式實現(xiàn)本公開而不應(yīng)被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達給本領(lǐng)域的技術(shù)人員。[0029]本發(fā)明就是為了讓同一個驅(qū)動能夠在不同的設(shè)備上加載并正常工作,可以訪問內(nèi)核中的symbol。要解決上述問題,就不能采用常規(guī)的方法訪問內(nèi)核symbol,否則會在驅(qū)動加載的時候通不過內(nèi)核symbol的版本信息的校驗。本發(fā)明提出的方法就是延遲綁定內(nèi)核符號:即在驅(qū)動中為每一個需要用到的內(nèi)核符號定義一個指針,在驅(qū)動初始化的時候從內(nèi)核中找到符號的地址,賦值給指針;在驅(qū)動中通過指針的方式訪問內(nèi)核的symbol。[0030]參見圖1,本發(fā)明實施例提供的在Linux驅(qū)動中綁定內(nèi)核符號的方法的流程圖,包括:[0031]SlOl:在驅(qū)動中為每一個需要用到的內(nèi)核符號定義一個指針;[0032]S102:在驅(qū)動初始化時,查找內(nèi)核符號表,并通過分析內(nèi)核符號表查找出驅(qū)動需要用到的內(nèi)核符號;將從內(nèi)核中查找到的各個內(nèi)核符號的地址賦值給驅(qū)動定義的各個內(nèi)核符號對應(yīng)的指針;[0033]S103:在驅(qū)動中通過指針的方式訪問內(nèi)核符號。[0034]本發(fā)明提供的完整技術(shù)方案如下。[0035](I)在驅(qū)動初始化時,找到內(nèi)核的符號表。[0036]所謂內(nèi)核符號表就是在內(nèi)核內(nèi)部函數(shù)或變量中可供外部引用的函數(shù)和變量的符號表。通常所說的內(nèi)核符號表其實是一個狹義的概念,它僅僅指能為所有驅(qū)動模塊公用的那部分內(nèi)核符號表。驅(qū)動是存在于內(nèi)核空間的,它的每一個函數(shù)每一個變量都會有對應(yīng)的符號,這部分符號也可以稱作內(nèi)核符號,它們不導(dǎo)出就只能為自身所用,導(dǎo)出后就可以成為公用,對于導(dǎo)出的那部分的內(nèi)核符號就是常說的內(nèi)核符號表。[0037]由于Linux內(nèi)核的地址空間從OxcOOOOOOO開始,所以內(nèi)核的函數(shù)變量的地址的最高4位都是OxC。從內(nèi)核的地址空間OxcOOOOOOO開始,搜索連續(xù)512個word,最高4位為OxC0內(nèi)核符號表有一個特點:每個符號占兩個word,第一個word是符號的地址,第二個是符號的名字。符號的名字是一個字符串指針,指向內(nèi)核中的一個字符串。根據(jù)這個特點,當找到連續(xù)大于512個word,最高4位為OxC,那么假設(shè)當前的位置就是內(nèi)核導(dǎo)出符號表的開始,然后連續(xù)驗證6個符號(此處6個符號僅是一個例子)的名字是否真的為字符串,如果是字符串,那么確定當前找到的就是內(nèi)核符號表的開始位置,如果不是字符串,那么重新搜索下一個符合條件的位置。[0038]參見圖2,示出了根據(jù)本發(fā)明一個實施例的搜索內(nèi)核符號表的流程圖,包括如下步驟:[0039]S201:開始;[0040]S202:設(shè)內(nèi)核地址空間的起始位置S=OxcOOOOOOO;[0041]S203:從S開始在內(nèi)核中搜索連續(xù)多于512個word的區(qū)域,每個word的最高4位為OxC;[0042]S204:是否找到區(qū)域;若是,執(zhí)行S205;否則,執(zhí)行S209;[0043]S205:設(shè)搜索到的區(qū)域開始地址為A,結(jié)束地址為B;[0044]S206:假設(shè)A位置就是符號表的開始位置,連續(xù)6個符號的符號名是否為字符串,若是,執(zhí)行S207,否則,執(zhí)行S208;[0045]S207:A與B之間就是內(nèi)核符號表的位置;[0046]S208:將S=B,并返回步驟S203重新搜索;[0047]S209:結(jié)束。[0048]可見,搜索內(nèi)核符號表的流程可以概括為:[0049]從內(nèi)核地址空間的起始位置開始,搜索是否存在預(yù)定大小的搜索區(qū)域,其中,預(yù)定大小的搜索區(qū)域是連續(xù)多于512個字的區(qū)域;[0050]從所述搜索區(qū)域開始查找,判斷連續(xù)預(yù)定數(shù)量符號的符號名是否為字符串;[0051]其中,對于對幾個符號名進行字符串的驗證,是可以靈活設(shè)置的,以上面例子是對6個符號進行驗證,6這個數(shù)字可以做一些調(diào)整,一般大于3,小于總的符號數(shù)就可以(Linux內(nèi)核的導(dǎo)出符號的數(shù)量在不同版本的內(nèi)核之間不一樣,一般都大于512),因此,上述預(yù)定數(shù)量符號是指大于3并小于512的數(shù)目的符號。[0052]如果是,則確定搜索區(qū)域是內(nèi)核符號表所在位置;[0053]如果否,則從上次搜索區(qū)域結(jié)束位置開始以預(yù)定大小的搜索區(qū)域重新搜索。[0054](2)分析符號表的類型,確定符號的查找方法。[0055]Linux內(nèi)核里面最重要的有兩個符號表是ksymtab和ksymtab_gpl,這兩個表緊挨著,都在A與B之間,搜索符號的最簡單的方法就是從頭到尾依次比較每個符號的名字。Linux內(nèi)核對符號表的組織在版本2.6和版本3.0之后的內(nèi)核有些區(qū)別,2.6-3.0版本之間的內(nèi)核,符號沒有排序,但是在>=3.0版本以后的內(nèi)核,ksymtab和ksymtab_gpl分別進行了按符號名進行了排序,為了提高符號的查找速度,可以分別在這兩個表中按二分查找算法查找。其中,二分查找又稱折半查找,優(yōu)點是比較次數(shù)少,查找速度快,平均性能好。首先,假設(shè)表中元素是按升序排列,將表中間位置記錄的關(guān)鍵字與查找關(guān)鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個子表,如果中間位置記錄的關(guān)鍵字大于查找關(guān)鍵字,則進一步查找前一子表,否則進一步查找后一子表。重復(fù)以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。[0056]所以找到符號表的位置后,首先判斷符號表是否是經(jīng)過排序的,方法如下:從開始位置A,找到第一個不是按符號名遞增排序的符號FA。從FA開始到符號表結(jié)尾,判斷是否是按符號名遞增排序的。如果遞增排序,說明FA就是ksymtab_gpl的開始位置,A-(FA-1)是ksymtab表,并且是經(jīng)過排序的,FA-B就是ksymtab_gpl表,也是經(jīng)過排序的。查找符號可以分別在兩個排序表里依據(jù)符號名按二分查找算法進行查找。如果不是遞增排序,說明整個符號表都不是排序的,查找符號只能是從頭到尾依次比較符號名。[0057]另外,除了按照上述方式查找符號之外,還可以通過一個內(nèi)核符號查找函數(shù)對符號進行查找。在查找到內(nèi)核符號表之后,首先查找內(nèi)核中是否存在內(nèi)核符號查找函數(shù);如果存在所述內(nèi)核符號查找函數(shù),則利用內(nèi)核符號查找函數(shù)查找出驅(qū)動需要用到的內(nèi)核符號;否則,才執(zhí)行上述判斷內(nèi)核符號表是否經(jīng)過排序以及按照二分查找算法或直接按照符號名字查找出所述驅(qū)動需要用到的內(nèi)核符號的步驟。在Linux內(nèi)核中,內(nèi)核符號查找函數(shù)即kallsyms_lookup_name,可以用來查找內(nèi)核符號。這個函數(shù)可以查找到更多的符號,而不僅僅是需要導(dǎo)出的內(nèi)核符號,當然這個函數(shù)可能會由于內(nèi)核的配置,不被編譯進內(nèi)核,所以在找到內(nèi)核符號表后,先從頭到尾查找這個函數(shù),如果找到這個函數(shù),以后就可以用這個函數(shù)查找剩下所有的符號了;如果沒有找到這個函數(shù)還是按上面的方法來查找符號。[0058](3)在符號表以及符號表的查找方法都確定后,就可以查找驅(qū)動中用到的那些符號,并把地址賦給對應(yīng)的指針,供后面調(diào)用,比如供驅(qū)動初始化過程的后續(xù)步驟調(diào)用以及驅(qū)動工作過程中的調(diào)用等。[0059]可見,采用本發(fā)明的技術(shù)方案,通過在驅(qū)動初始化時查找內(nèi)核符號表,并通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號,并將各個內(nèi)核符號的地址賦值給驅(qū)動預(yù)先定義的各個內(nèi)核符號對應(yīng)的指針,從而可以在驅(qū)動中通過指針的方式訪問內(nèi)核符號。采用本發(fā)明的技術(shù)方案,可以開發(fā)出一個在不同版本內(nèi)核中通用的驅(qū)動,不用在不同版本內(nèi)核的源碼下分別編譯,減少開發(fā)的工作量以及適配的工作量。[0060]與上述方法相對應(yīng),本發(fā)明還提供一種在Linux驅(qū)動中綁定內(nèi)核符號的裝置。該裝置可以通過硬件、軟件或軟硬件結(jié)合方式實現(xiàn)。該裝置可以是指Linux系統(tǒng)的功能模塊,也可以是指安裝Linux系統(tǒng)的硬件設(shè)備,只要可實現(xiàn)該裝置的功能即可。[0061]圖3示出了根據(jù)本發(fā)明一個實施例的在Linux驅(qū)動中綁定內(nèi)核符號的裝置示意圖。該裝置包括:[0062]指針定義單元301,用于在驅(qū)動中為每一個需要用到的內(nèi)核符號定義一個指針;[0063]內(nèi)核符號表查找單兀302,用于在驅(qū)動初始化時,查找內(nèi)核符號表;[0064]內(nèi)核符號查找單元303,用于在驅(qū)動初始化時,通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號;[0065]指針賦值單元304,用于在驅(qū)動初始化時,將從內(nèi)核中查找到的各個內(nèi)核符號的地址賦值給所述驅(qū)動定義的各個內(nèi)核符號對應(yīng)的指針;[0066]內(nèi)核符號訪問單元305,用于在驅(qū)動中通過指針的方式訪問內(nèi)核符號。[0067]優(yōu)選的,所述內(nèi)核符號表查找單元302具體用于:從內(nèi)核地址空間的起始位置開始,設(shè)定預(yù)定大小的搜索區(qū)域;從所述搜索區(qū)域開始查找,判斷連續(xù)預(yù)定數(shù)量符號的符號名是否為字符串;如果是,則確定所述搜索區(qū)域是內(nèi)核符號表所在位置;如果否,則從上次所述搜索區(qū)域結(jié)束位置開始以所述預(yù)定大小的搜索區(qū)域重新搜索。[0068]優(yōu)選的,所述內(nèi)核符號表查找單元302還用于:在內(nèi)核地址空間搜索是否存在所述預(yù)定大小的搜索區(qū)域,其中,所述預(yù)定大小的搜索區(qū)域是連續(xù)多于512個字的區(qū)域。[0069]優(yōu)選的,所述預(yù)定數(shù)量符號是指大于3并小于512的數(shù)目的符號。[0070]優(yōu)選的,所述內(nèi)核符號查找單元303具體用于:判斷內(nèi)核符號表中的符號是否經(jīng)過排序的;如果符號是經(jīng)過排序的,根據(jù)符號名字按照二分查找算法查找出所述驅(qū)動需要用到的內(nèi)核符號;如果符號不是經(jīng)過排序的,在內(nèi)核符號表中從頭至尾按照符號名查找出所述驅(qū)動需要用到的內(nèi)核符號。[0071]優(yōu)選的,所述內(nèi)核符號查找單兀303還用于:在查找到內(nèi)核符號表之后,首先查找內(nèi)核中是否存在內(nèi)核符號查找函數(shù);如果存在所述內(nèi)核符號查找函數(shù),則利用所述內(nèi)核符號查找函數(shù)查找出所述驅(qū)動需要用到的內(nèi)核符號;否則,才執(zhí)行所述判斷內(nèi)核符號表是否經(jīng)過排序以及按照二分查找算法或直接按照符號名字查找出所述驅(qū)動需要用到的內(nèi)核符號的步驟。[0072]所述內(nèi)核符號查找單元303還用于:從內(nèi)核符號表開始位置A,找到第一個不是按照符號名遞增排序的符號的位置FA;從FA開始到內(nèi)核符號表結(jié)束位置B,判斷符號是否按照符號名遞增排序的;如果是,則確定內(nèi)核符號表是經(jīng)過排序的,其中,所述內(nèi)核符號表包括兩個,第一個內(nèi)核符號表的位置是從A至FA-1,第二個內(nèi)核符號表的位置是從FA至B;否則,則確定內(nèi)核符號表不是經(jīng)過排序的。[0073]優(yōu)選的,所述第一個內(nèi)核符號表是指ksymtab符號表,所述第二個內(nèi)核符號表是指ksymtab_gpl符號表。[0074]在此提供的算法和顯示不與任何特定計算機、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應(yīng)當明白,可以利用各種編程語言實現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實施方式。[0075]在此處所提供的說明書中,說明了大量具體細節(jié)。然而,能夠理解,本發(fā)明的實施例可以在沒有這些具體細節(jié)的情況下實踐。在一些實例中,并未詳細示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。[0076]類似地,應(yīng)當理解,為了精簡本公開并幫助理解各個發(fā)明方面中的一個或多個,在上面對本發(fā)明的示例性實施例的描述中,本發(fā)明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護的本發(fā)明要求比在每個權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個實施例的所有特征。因此,遵循【具體實施方式】的權(quán)利要求書由此明確地并入該【具體實施方式】,其中每個權(quán)利要求本身都作為本發(fā)明的單獨實施例。[0077]本領(lǐng)域那些技術(shù)人員可以理解,可以對實施例中的設(shè)備中的模塊進行自適應(yīng)性地改變并且把它們設(shè)置在與該實施例不同的一個或多個設(shè)備中??梢园褜嵤├械哪K或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。[0078]此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實施例。例如,在下面的權(quán)利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。[0079]本發(fā)明的各個部件實施例可以以硬件實現(xiàn),或者以在一個或者多個處理器上運行的軟件模塊實現(xiàn),或者以它們的組合實現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當理解,可以在實踐中使用微處理器或者數(shù)字信號處理器(DSP)來實現(xiàn)根據(jù)本發(fā)明實施例的在Linux驅(qū)動中綁定內(nèi)核符號的裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計算機程序和計算機程序產(chǎn)品)。這樣的實現(xiàn)本發(fā)明的程序可以存儲在計算機可讀介質(zhì)上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。[0080]應(yīng)該注意的是上述實施例對本發(fā)明進行說明而不是對本發(fā)明進行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計出替換實施例。在權(quán)利要求中,不應(yīng)將位于括號之間的任何參考符號構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當編程的計算機來實現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。[0081]本發(fā)明提供如下方案:[0082]Al、一種在Linux驅(qū)動中綁定內(nèi)核符號的方法,包括:[0083]在驅(qū)動中為每一個需要用到的內(nèi)核符號定義一個指針;[0084]在驅(qū)動初始化時,查找內(nèi)核符號表,并通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號;將從內(nèi)核中查找到的各個內(nèi)核符號的地址賦值給所述驅(qū)動定義的各個內(nèi)核符號對應(yīng)的指針;[0085]在驅(qū)動中通過指針的方式訪問內(nèi)核符號。[0086]A2、如Al所述的方法,所述查找內(nèi)核符號表包括:[0087]從內(nèi)核地址空間的起始位置開始,設(shè)定預(yù)定大小的搜索區(qū)域;[0088]從所述搜索區(qū)域開始查找,判斷連續(xù)預(yù)定數(shù)量符號的符號名是否為字符串;[0089]如果是,則確定所述搜索區(qū)域是內(nèi)核符號表所在位置;[0090]如果否,則從上次所述搜索區(qū)域結(jié)束位置開始以所述預(yù)定大小的搜索區(qū)域重新搜索。[0091]A3、如A2所述的方法,還包括:在內(nèi)核地址空間搜索是否存在所述預(yù)定大小的搜索區(qū)域,其中,所述預(yù)定大小的搜索區(qū)域是連續(xù)多于512個字的區(qū)域。[0092]A4、如A2所述的方法,所述預(yù)定數(shù)量符號是指大于3并小于512的數(shù)目的符號。[0093]A5、如Al所述的方法,所述通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號包括:[0094]判斷內(nèi)核符號表中的符號是否經(jīng)過排序的;[0095]如果符號是經(jīng)過排序的,根據(jù)符號名字按照二分查找算法查找出所述驅(qū)動需要用到的內(nèi)核符號;[0096]如果符號不是經(jīng)過排序的,在內(nèi)核符號表中從頭至尾按照符號名查找出所述驅(qū)動需要用到的內(nèi)核符號。[0097]A6、如A5所述的方法,還包括:[0098]在查找到內(nèi)核符號表之后,首先查找內(nèi)核中是否存在內(nèi)核符號查找函數(shù);[0099]如果存在所述內(nèi)核符號查找函數(shù),則利用所述內(nèi)核符號查找函數(shù)查找出所述驅(qū)動需要用到的內(nèi)核符號;[0100]否則,才執(zhí)行所述判斷內(nèi)核符號表是否經(jīng)過排序以及按照二分查找算法或直接按照符號名字查找出所述驅(qū)動需要用到的內(nèi)核符號的步驟。[0101]A7、如A5所述的方法,所述判斷內(nèi)核符號表中的符號是否經(jīng)過排序的包括:[0102]從內(nèi)核符號表開始位置A,找到第一個不是按照符號名遞增排序的符號的位置FA;[0103]從FA開始到內(nèi)核符號表結(jié)束位置B,判斷符號是否按照符號名遞增排序的;[0104]如果是,則確定內(nèi)核符號表是經(jīng)過排序的,其中,所述內(nèi)核符號表包括兩個,第一個內(nèi)核符號表的位置是從A至FA-1,第二個內(nèi)核符號表的位置是從FA至B;[0105]否則,則確定內(nèi)核符號表不是經(jīng)過排序的。[0106]A8、如A7所述的方法,所述第一個內(nèi)核符號表是指ksymtab符號表,所述第二個內(nèi)核符號表是指ksymtab_gpl符號表。[0107]B9、一種在Linux驅(qū)動中綁定內(nèi)核符號的裝置,包括:[0108]指針定義單元,用于在驅(qū)動中為每一個需要用到的內(nèi)核符號定義一個指針;[0109]內(nèi)核符號表查找單兀,用于在驅(qū)動初始化時,查找內(nèi)核符號表;[0110]內(nèi)核符號查找單元,用于在驅(qū)動初始化時,通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號;[0111]指針賦值單元,用于在驅(qū)動初始化時,將從內(nèi)核中查找到的各個內(nèi)核符號的地址賦值給所述驅(qū)動定義的各個內(nèi)核符號對應(yīng)的指針;[0112]內(nèi)核符號訪問單元,用于在驅(qū)動中通過指針的方式訪問內(nèi)核符號。[0113]B10、如B9所述的裝置,所述內(nèi)核符號表查找單元具體用于:從內(nèi)核地址空間的起始位置開始,設(shè)定預(yù)定大小的搜索區(qū)域;從所述搜索區(qū)域開始查找,判斷連續(xù)預(yù)定數(shù)量符號的符號名是否為字符串;如果是,則確定所述搜索區(qū)域是內(nèi)核符號表所在位置;如果否,則從上次所述搜索區(qū)域結(jié)束位置開始以所述預(yù)定大小的搜索區(qū)域重新搜索。[0114]B11、如BlO所述的裝置,所述內(nèi)核符號表查找單元還用于:在內(nèi)核地址空間搜索是否存在所述預(yù)定大小的搜索區(qū)域,其中,所述預(yù)定大小的搜索區(qū)域是連續(xù)多于512個字的區(qū)域。[0115]B12、如BlO所述的裝置,所述預(yù)定數(shù)量符號是指大于3并小于512的數(shù)目的符號。[0116]B13、如B9所述的裝置,所述內(nèi)核符號查找單元具體用于:判斷內(nèi)核符號表中的符號是否經(jīng)過排序的;如果符號是經(jīng)過排序的,根據(jù)符號名字按照二分查找算法查找出所述驅(qū)動需要用到的內(nèi)核符號;如果符號不是經(jīng)過排序的,在內(nèi)核符號表中從頭至尾按照符號名查找出所述驅(qū)動需要用到的內(nèi)核符號。[0117]B14、如B13所述的方法,所述內(nèi)核符號查找單兀還用于:在查找到內(nèi)核符號表之后,首先查找內(nèi)核中是否存在內(nèi)核符號查找函數(shù);如果存在所述內(nèi)核符號查找函數(shù),則利用所述內(nèi)核符號查找函數(shù)查找出所述驅(qū)動需要用到的內(nèi)核符號;否則,才執(zhí)行所述判斷內(nèi)核符號表是否經(jīng)過排序以及按照二分查找算法或直接按照符號名字查找出所述驅(qū)動需要用到的內(nèi)核符號的步驟。[0118]B15、如B14所述的裝置,所述內(nèi)核符號查找單元還用于:從內(nèi)核符號表開始位置A,找到第一個不是按照符號名遞增排序的符號的位置FA;從FA開始到內(nèi)核符號表結(jié)束位置B,判斷符號是否按照符號名遞增排序的;如果是,則確定內(nèi)核符號表是經(jīng)過排序的,其中,所述內(nèi)核符號表包括兩個,第一個內(nèi)核符號表的位置是從A至FA-1,第二個內(nèi)核符號表的位置是從FA至B;否則,則確定內(nèi)核符號表不是經(jīng)過排序的。[0119]B16、如B15所述的方法,所述第一個內(nèi)核符號表是指ksymtab符號表,所述第二個內(nèi)核符號表是指ksymtab_gpl符號表?!緳?quán)利要求】1.一種在Linux驅(qū)動中綁定內(nèi)核符號的方法,其特征在于,包括:在驅(qū)動中為每一個需要用到的內(nèi)核符號定義一個指針;在驅(qū)動初始化時,查找內(nèi)核符號表,并通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號;將從內(nèi)核中查找到的各個內(nèi)核符號的地址賦值給所述驅(qū)動定義的各個內(nèi)核符號對應(yīng)的指針;在驅(qū)動中通過指針的方式訪問內(nèi)核符號。2.如權(quán)利要求1所述的方法,其特征在于,所述查找內(nèi)核符號表包括:從內(nèi)核地址空間的起始位置開始,設(shè)定預(yù)定大小的搜索區(qū)域;從所述搜索區(qū)域開始查找,判斷連續(xù)預(yù)定數(shù)量符號的符號名是否為字符串;如果是,則確定所述搜索區(qū)域是內(nèi)核符號表所在位置;如果否,則從上次所述搜索區(qū)域結(jié)束位置開始以所述預(yù)定大小的搜索區(qū)域重新搜索。3.如權(quán)利要求2所述的方法,其特征在于,還包括:在內(nèi)核地址空間搜索是否存在所述預(yù)定大小的搜索區(qū)域,其中,所述預(yù)定大小的搜索區(qū)域是連續(xù)多于512個字的區(qū)域。4.如權(quán)利要求2所述的方法,其特征在于,所述預(yù)定數(shù)量符號是指大于3并小于512的數(shù)目的符號。5.如權(quán)利要求1所述的方法,其特征在于,所述通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號包括:判斷內(nèi)核符號表中的符號是否經(jīng)過排序的;如果符號是經(jīng)過排序的,根據(jù)符號名字按照二分查找算法查找出所述驅(qū)動需要用到的內(nèi)核符號;如果符號不是經(jīng)過排序的,在內(nèi)核符號表中從頭至尾按照符號名查找出所述驅(qū)動需要用到的內(nèi)核符號。6.如權(quán)利要求5所述的方法,其特征在于,還包括:在查找到內(nèi)核符號表之后,首先查找內(nèi)核中是否存在內(nèi)核符號查找函數(shù);如果存在所述內(nèi)核符號查找函數(shù),則利用所述內(nèi)核符號查找函數(shù)查找出所述驅(qū)動需要用到的內(nèi)核符號;否則,才執(zhí)行所述判斷內(nèi)核符號表是否經(jīng)過排序以及按照二分查找算法或直接按照符號名字查找出所述驅(qū)動需要用到的內(nèi)核符號的步驟。7.如權(quán)利要求5所述的方法,其特征在于,所述判斷內(nèi)核符號表中的符號是否經(jīng)過排序的包括:從內(nèi)核符號表開始位置A,找到第一個不是按照符號名遞增排序的符號的位置FA;從FA開始到內(nèi)核符號表結(jié)束位置B,判斷符號是否按照符號名遞增排序的;如果是,則確定內(nèi)核符號表是經(jīng)過排序的,其中,所述內(nèi)核符號表包括兩個,第一個內(nèi)核符號表的位置是從A至FA-1,第二個內(nèi)核符號表的位置是從FA至B;否則,則確定內(nèi)核符號表不是經(jīng)過排序的。8.如權(quán)利要求7所述的方法,其特征在于,所述第一個內(nèi)核符號表是指ksymtab符號表,所述第二個內(nèi)核符號表是指ksymtab_gpl符號表。9.一種在Linux驅(qū)動中綁定內(nèi)核符號的裝置,其特征在于,包括:指針定義單元,用于在驅(qū)動中為每一個需要用到的內(nèi)核符號定義一個指針;內(nèi)核符號表查找單兀,用于在驅(qū)動初始化時,查找內(nèi)核符號表;內(nèi)核符號查找單元,用于在驅(qū)動初始化時,通過分析內(nèi)核符號表查找出所述驅(qū)動需要用到的內(nèi)核符號;指針賦值單元,用于在驅(qū)動初始化時,將從內(nèi)核中查找到的各個內(nèi)核符號的地址賦值給所述驅(qū)動定義的各個內(nèi)核符號對應(yīng)的指針;內(nèi)核符號訪問單元,用于在驅(qū)動中通過指針的方式訪問內(nèi)核符號。10.如權(quán)利要求9所述的裝置,其特征在于,所述內(nèi)核符號表查找單元具體用于:從內(nèi)核地址空間的起始位置開始,設(shè)定預(yù)定大小的搜索區(qū)域;從所述搜索區(qū)域開始查找,判斷連續(xù)預(yù)定數(shù)量符號的符號名是否為字符串;如果是,則確定所述搜索區(qū)域是內(nèi)核符號表所在位置;如果否,則從上次所述搜索區(qū)域結(jié)束位置開始以所述預(yù)定大小的搜索區(qū)域重新搜索?!疚臋n編號】G06F17/30GK104376126SQ201410766158【公開日】2015年2月25日申請日期:2014年12月11日優(yōu)先權(quán)日:2014年12月11日【發(fā)明者】陳章琪申請人:北京奇虎科技有限公司,奇智軟件(北京)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1