專利名稱:具有指令簽名支持的分布式編譯處理的制作方法
具有指令簽名支持的分布式編譯處理技術(shù)領(lǐng)域
本申請(qǐng)涉及用于向編譯器提供指令簽名支持(instruction signature support) 的編譯模塊,更具體地,涉及在高級(jí)語(yǔ)言源代碼的編譯處理期間處理指令簽名相關(guān)的信息。
背景技術(shù):
可編程計(jì)算單元通常被設(shè)計(jì)為處理指令序列,以執(zhí)行特定任務(wù)。指令序列也可稱 為程序代碼。程序代碼通常存儲(chǔ)在存儲(chǔ)器中,并在運(yùn)行時(shí)被提供至計(jì)算單元。鑒于信息安 全,可能期望在指令存儲(chǔ)于存儲(chǔ)器中或從存儲(chǔ)器傳輸至計(jì)算單元時(shí)保護(hù)指令不被分析。另 一方面,如果到達(dá)計(jì)算單元的指令不同于所需的指令,則可能會(huì)在程序代碼執(zhí)行期間發(fā)生 錯(cuò)誤。由計(jì)算單元實(shí)際處理的指令和所需指令之間的差異可能有隨機(jī)的原因,或可能由入 侵者故意引起。在任何情況下,都應(yīng)及早檢測(cè)到由改變的指令所造成的錯(cuò)誤。
控制流檢查方法可用于檢測(cè)由計(jì)算單元實(shí)際處理的指令和所需指令之間的這種 差異?;谥噶詈灻目刂屏鳈z查方法的基本原則是在程序運(yùn)行期間在校驗(yàn)和(即,簽名) 中計(jì)算程序運(yùn)行時(shí)所執(zhí)行的指令總數(shù),并在預(yù)定的程序點(diǎn)驗(yàn)證該校驗(yàn)和是否匹配參考值。 校驗(yàn)和與參考值之間的差表明實(shí)際程序執(zhí)行和預(yù)計(jì)程序執(zhí)行之間的可能偏差。
當(dāng)創(chuàng)建或編譯支持控制流檢查的程序時(shí),最常見(jiàn)的控制流檢測(cè)方法需要所謂的更 新值插入程序中的特定點(diǎn)。例如,如果程序跳變或分支點(diǎn)發(fā)生,且兩個(gè)不同的路徑(在不同 指令序列被執(zhí)行進(jìn)而導(dǎo)致不同簽名的意義上不同)再次合并,由路徑執(zhí)行產(chǎn)生的簽名需要 在合并點(diǎn)處是一致的。為此,更新的值插入至少一個(gè)路徑。分支發(fā)生在條件(直接)跳變、間 接跳變、直接和間接函數(shù)調(diào)用處。此外,在執(zhí)行將運(yùn)行期間計(jì)算的簽名和參考值進(jìn)行比較的 程序點(diǎn)處需要參考值。這些參考值也需要在適當(dāng)?shù)某绦螯c(diǎn)處被引入程序。發(fā)明內(nèi)容
本文所述的實(shí)施方式提供了一種用于向編譯器提供指令簽名支持的編譯模塊 (compiler module)。該編譯模塊包括語(yǔ)言結(jié)構(gòu)識(shí)別器,被配置為在供應(yīng)至編譯器的高級(jí) 語(yǔ)言源代碼中識(shí)別指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu);以及占位符插入組件,被配置為與編譯器 (compiler)交互,從而將基于指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)的至少一個(gè)指令簽名相關(guān)的占位符 插入由編譯器基于高級(jí)語(yǔ)言源代碼而處理的編譯代碼中。
本文所述的其它實(shí)施方式提供了一種指令簽名生成器,包括用于編譯代碼的輸 入、占位符識(shí)別器、簽名計(jì)算器和占位符替換器。占位符識(shí)別器被配置為在編譯代碼中識(shí)別 指令簽名相關(guān)的占位符。簽名計(jì)算器被配置為確定針對(duì)編譯代碼中發(fā)生所述指令簽名相關(guān) 的占位符處的程序點(diǎn)的簽名值。占位符替換器被配置為基于程序點(diǎn)處的簽名值來(lái)插入編譯 代碼段。
本文所述的其它實(shí)施方式提供了一種編譯器接口數(shù)據(jù)結(jié)構(gòu),其包括編譯指令,其 中至少有一個(gè)是編譯指令為指令簽名相關(guān)的占位符。
本文所述的其它實(shí)施方式提供了一種在高級(jí)語(yǔ)言源代碼的編譯處理中處理指令簽名相關(guān)信息的方法,該方法包括在高級(jí)語(yǔ)言源代碼中識(shí)別指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu); 與編譯處理交互,以便將基于指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)的至少一個(gè)指令簽名相關(guān)的占位符插入由編譯處理基于高級(jí)語(yǔ)言源代碼所處理的編譯代碼中。
本文所述的其它實(shí)施方式提供了一種計(jì)算機(jī)可讀數(shù)字存儲(chǔ)介質(zhì),具有程序代碼的計(jì)算機(jī)程序存儲(chǔ)于其上,當(dāng)在計(jì)算機(jī)上運(yùn)行時(shí)該程序代碼用于執(zhí)行在高級(jí)語(yǔ)言源代碼的編譯處理期間用于處理指令簽名相關(guān)的信息的方法,所述方法包括在高級(jí)語(yǔ)言源代碼中識(shí)別指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu);與編譯處理交互,以便將基于指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)的至少一個(gè)指令簽名相關(guān)的占位符插入以高級(jí)語(yǔ)言源代碼為基礎(chǔ)通過(guò)編譯處理所處理的編譯代碼中。
本文所述的其它實(shí)施方式提供了一種產(chǎn)生指令簽名的方法,該方法包括確定指令簽名相關(guān)的占位符應(yīng)插入編譯代碼中何處程序位置;確定針對(duì)編譯代碼中發(fā)生指令簽名相關(guān)的占位符處的程序位置的簽名值,并在該程序位置處插入編譯代碼段(其在所確定的簽名值的基礎(chǔ)上隱式或顯式地產(chǎn)生更新)。
本領(lǐng)域的技術(shù)人員在閱讀了以下詳細(xì)描述并查看附圖之后將認(rèn)識(shí)其它的特征和優(yōu)點(diǎn)。
附圖的元件不一定彼此成比例。相同的參考符號(hào)表示相應(yīng)的類似部件。各個(gè)所示實(shí)施方式的特征可組合,除非它們互相排斥。實(shí)施方式描述于附圖中,且詳細(xì)描述如下。
圖1示出包括條件分支、默認(rèn)路徑、以及非默認(rèn)路徑的指令序列的示意性流程圖。
圖2示出提供指令簽名支持的編譯處理的示意性流程圖。
圖3示出編譯器以及用于對(duì)編譯器提供指令簽名支持的編譯模塊的示意性框圖。
圖4說(shuō)明用于指令簽名支持的編譯模塊和指令簽名生成器的效果。
圖5示出指令簽名生成器的示意性框圖。
圖6示出用于處理指令簽名相關(guān)的信息的方法的示意性流程圖。
具體實(shí)施方式
指令流簽名通常會(huì)提供程序代碼的比較強(qiáng)的完整性保護(hù)。如圖1中可以看出,帶有條件分支指令(例如,指令i2)的每個(gè)代碼序列具有“默認(rèn)路徑”,在圖1中經(jīng)由指令i3和 i4至指令i5處的合并點(diǎn)。對(duì)于該“默認(rèn)路徑”,簽名S5由靜態(tài)代碼分析器計(jì)算。為了處理 “非默認(rèn)路徑”(例如,從指令i2直接到指令i5),在每一個(gè)條件分支處執(zhí)行簽名更新,以便該簽名與好像進(jìn)行了默認(rèn)路徑的簽名一樣。圖1中說(shuō)明了這一點(diǎn),箭頭標(biāo)記的“更新SI+Λ” 是指按照與在進(jìn)行默認(rèn)路徑的情況下由指令i3和i4修改的SI相同的方式來(lái)修改SI。如果默認(rèn)路徑是唯一路徑而從開(kāi)始到結(jié)束沒(méi)有進(jìn)行更新,則可以由用戶或程序員隱式定義哪個(gè)路徑是默認(rèn)路徑。一般來(lái)說(shuō),任何路徑都可以是默認(rèn)路徑。
實(shí)際的程序通常包含帶有更新值或參考值的多個(gè)程序點(diǎn)。此處,更新值和參考值統(tǒng)稱為簽名值。簽名值插入的位置或程序點(diǎn)被稱為簽名位置??s寫(xiě)IS S代表指令流簽名 (Instruction Stream Signature)。
創(chuàng)建控制流保護(hù)代碼的一個(gè)方法是程序員在他知道的簽名位置處將簽名值手動(dòng)插入代碼的選定部分。為此,程序員必須自己確定簽名值和簽名位置。然而,許多編譯器和 連接器執(zhí)行優(yōu)化步驟和程序代碼內(nèi)的指令序列的修改,這對(duì)于程序員是很難預(yù)料的。
如果程序員自己確定簽名值和簽名位置,則可能會(huì)引起復(fù)雜的、容易出錯(cuò)的、重復(fù) 的工作流程并會(huì)根據(jù)能夠被插入的簽名值的等級(jí)進(jìn)行限制??赡艹霈F(xiàn)的一些限制是
-當(dāng)以高級(jí)語(yǔ)言插入簽名值時(shí),程序員可能通常僅使用編程語(yǔ)言的語(yǔ)言結(jié)構(gòu)的子 集,用于所有可能的簽名值插入。例如,對(duì)于在高級(jí)編程語(yǔ)言中常用的特定語(yǔ)言結(jié)構(gòu),并非 所有的簽名位置都可從源代碼級(jí)訪問(wèn)。以下形式的條件分支
a) if X>0and x〈lthen
1.指令序列A
b) end if
1.指令序列B
-可能會(huì)經(jīng)常導(dǎo)致兩個(gè)條件跳變,因?yàn)樵诘谝恢噶钪袡z查兩個(gè)條件,以到達(dá)指令序 列A。然而,好的編譯器會(huì)避免檢查全部這兩個(gè)條件,以便導(dǎo)致僅一個(gè)跳變,因?yàn)檫@會(huì)導(dǎo)致平 均50%以上更慢的代碼。因此,兩個(gè)更新值須被插入兩個(gè)非默認(rèn)路徑。然而,這在源代碼級(jí) 上是不可能的,因此必須使用另一個(gè)程序結(jié)構(gòu)。
-對(duì)于已經(jīng)以高級(jí)語(yǔ)言寫(xiě)入的代碼并不總是能夠以匯編語(yǔ)言級(jí)插入簽名值。許多 編譯器直接生成二進(jìn)制代碼(機(jī)器語(yǔ)言代碼),且匯編級(jí)根本不可用。
-處于二進(jìn)制代碼級(jí)(機(jī)器代碼級(jí))的簽名值的插入會(huì)導(dǎo)致指令在程序代碼中的偏 移,因此必須相應(yīng)地更正跳變目的地。這個(gè)處理非常復(fù)雜,原因在于所有的跳變起點(diǎn)和跳變 目的地都必須進(jìn)行分析。此外,甚至也可能是跳變或分支指令被取代,原因在于跳變距離偏 移如此多,使得它們超出了二進(jìn)制代碼中所提供的跳變指令范圍。
-在每級(jí)上,程序員都可能在找簽名位置時(shí)出錯(cuò)(例如,不慎遺漏簽名位置)和/或 錯(cuò)誤計(jì)算簽名值。
由編譯器和/或連接器執(zhí)行的優(yōu)化可迫使程序員的進(jìn)一步限制和/或努力。特別 地,由編譯器和連接器進(jìn)行的代碼修改可處理如下
-程序員首先通過(guò)編譯器和連接器創(chuàng)建二進(jìn)制代碼。
-程序員選擇對(duì)于編譯器和連接器所造成的修改是透明的指令簽名方法。因此,大 大地降低了簽名的效果,原因在于指令簽名方法對(duì)于編譯器和連接器修改是透明的。
根據(jù)本文所述實(shí)施方式的編譯模塊、指令簽名生成器、編譯器接口數(shù)據(jù)結(jié)構(gòu)、用于 在高級(jí)語(yǔ)言源代碼編譯處理期間處理指令簽名相關(guān)的信息的方法,以及相應(yīng)的計(jì)算機(jī)可讀 數(shù)字存儲(chǔ)介質(zhì)解決了現(xiàn)有指令簽名方法的缺點(diǎn)。根據(jù)本文所述的實(shí)施方式,在編譯步驟和 隨后的簽名生成步驟期間所執(zhí)行的措施以有效方式組合。因此,本文所述的實(shí)施方式能夠 實(shí)現(xiàn)對(duì)普通編程語(yǔ)言的完全支持,使得i)編程語(yǔ)言的語(yǔ)法可用于控制流保護(hù)程序和程序部 分的全部范圍,以及ii)由(例如)未受保護(hù)的程序部分生成控制流保護(hù)程序或程序部分能 夠以基本上完全自動(dòng)的方式執(zhí)行。因此,本文所述的實(shí)施方式涉及具有指令簽名支持的分 布式編譯處理和/或具有指令流控制的(計(jì)算機(jī))程序的生成。
本文所述的實(shí)施方式便于簽名值插入和計(jì)算的自動(dòng)化,以及在兩個(gè)主要階段(基 本是占位符的插入和計(jì)算)中處理的分離。本文所述的實(shí)施方式還涉及兩個(gè)步驟之間的接 口。兩個(gè)主要階段由單獨(dú)的工具、編譯模塊(“簽名編譯器”)和指令簽名生成器執(zhí)行。
程序員可經(jīng)由提供至編譯器的高級(jí)語(yǔ)言源代碼影響指令簽名支持的應(yīng)用。
例如,在要被保護(hù)的代碼的開(kāi)始處,用戶可通過(guò)函數(shù)FCT_ISS_Start()使能ISS (指令流簽名)。在要被保護(hù)的代碼序列(或受保護(hù)的程序代碼段)結(jié)束時(shí),函數(shù)FCT_ISS_ Stop O檢查簽名并再次關(guān)閉ISS。用于FCT_ISS_Start()的常量參數(shù)ref在稍后的時(shí)間 由簽名指令生成器計(jì)算,并由靜態(tài)代碼檢查器(或簽名指令生成器)在包括編譯代碼的文件 (.elf文件)中補(bǔ)丁。在函數(shù)ISS_UPDATE最開(kāi)始處,占位符必須插入常數(shù)值被計(jì)算出并且 由靜態(tài)代碼檢查器補(bǔ)丁的地方。在每個(gè)函數(shù)調(diào)用、直接和間接調(diào)用后,額外的ISS_UPDATE 占位符必須插入常數(shù)被計(jì)算出和補(bǔ)丁的地方,以便在下一個(gè)FCT_ISS_Check()或FCT_ISS_ STOPO處得到正確值。
通過(guò)函數(shù)FCT_ISS_Status(),用戶可以檢查ISS代碼序列是否已被正確地執(zhí)行。 在運(yùn)行ISS代碼序列期間,用戶可以經(jīng)由FCT_ISS_Check()在安全關(guān)鍵點(diǎn)處插入額外的檢 查點(diǎn),在此處常量參數(shù)ref被計(jì)算和補(bǔ)丁,以便預(yù)計(jì)值位于處理器或簽名模塊的專用寄存 器(ISS_DATA寄存器)中,前提條件是指令的執(zhí)行并未包含錯(cuò)誤。
圖2示出在工具流程(即,用于將高級(jí)語(yǔ)言源代碼轉(zhuǎn)換成能夠(直接)由處理器執(zhí)行 的二進(jìn)制代碼的編譯環(huán)境)中的ISS集成。ISS主要支持兩部分
-用于ISS_UPDATE占位符插入以及將一些信息轉(zhuǎn)發(fā)到靜態(tài)代碼檢查器的編譯器 支持(例如,以內(nèi)部或外部編譯模塊的形式);用于識(shí)別應(yīng)該是ISS保護(hù)的程序區(qū)域(例如,函 數(shù))的編譯器支持;用于識(shí)別特定的ISS相關(guān)的函數(shù)(諸如,F(xiàn)CT_ISS_Check())的編譯器支 持。由指令簽名支持工具所擴(kuò)展的編譯器在本文中也被稱為“簽名編譯器”。
-指令簽名生成器或靜態(tài)代碼檢查器,其是進(jìn)行簽名計(jì)算以及通過(guò)簽名值替換 ISS_UPDATE占位符的后處理工具。
為了提供兩部分交互的一般理解,簽名編譯器和指令簽名生成器的主要功能簡(jiǎn)要 描述如下。
簽名編譯器通常實(shí)現(xiàn)以下方面
-在簽名位置處插入針對(duì)簽名值的占位符?;谝唤M規(guī)則和源代碼級(jí)編譯指示 (pragma)和/或關(guān)鍵字來(lái)確定位置。該組規(guī)則將在下面更詳細(xì)地解釋。
-控制信息的可選生成,被稱為“簽名控制信息”
-稱為“簽名庫(kù)函數(shù)”的軟件庫(kù)的提供,在控制信息的基礎(chǔ)上選擇其元素。
指令簽名生成器通常實(shí)現(xiàn)以下方面
-讀取簽名編譯器產(chǎn)生的編譯代碼以及(如果適用)簽名控制信息;
-基于基本塊和默認(rèn)路徑分析計(jì)算簽名值;以及
-在相應(yīng)占位符的位置處插入計(jì)算出的簽名值。“簽名插入”的概念一般是指在占 位符的位置處插入一個(gè)或多個(gè)機(jī)器指令,其包含有關(guān)簽名值的信息,且可選地,關(guān)于處理簽 名值(例如,更新簽名)所需指令的信息。
在圖2中,一個(gè)或多個(gè)源文件202 (例如,以高級(jí)C語(yǔ)言,由文件擴(kuò)展名“C”表示) 提供至編譯器210。編譯器210包括編譯模塊212 (“ISS擴(kuò)展”),其將指令簽名的特定處 理的支持添加至編譯器210。如圖2所示,編譯模塊212可與編譯器210集成?;蛘撸幾g 模塊212可為例如以動(dòng)態(tài)鏈接庫(kù)、動(dòng)態(tài)共享對(duì)象、添加、插件或軟件擴(kuò)展形式的外部模塊。 編譯器210在源文件202的基礎(chǔ)上產(chǎn)生具有文件擴(kuò)展名ο”的對(duì)象文件222。此外,編譯器210可產(chǎn)生列表文件214,主要用于信息和/或調(diào)試的目的。對(duì)象文件222內(nèi)的編制代 碼通常在多個(gè)程序點(diǎn)處包括數(shù)個(gè)指令簽名相關(guān)的占位符。已經(jīng)由編譯模塊212將指令簽名 相關(guān)的占位符添加至經(jīng)編譯的代碼,以便保留針對(duì)可用于今后簽名值插入的存儲(chǔ)空間。編 譯模塊212可基本上與編譯器210編譯源代碼同時(shí)地執(zhí)行占位符插入。以此方式,編譯器 210在編譯處理的早期階段知曉插入的占位符,并可能在繼續(xù)進(jìn)行編譯處理時(shí)(特別是在計(jì) 算分支或跳變目的地時(shí))考慮有關(guān)占位符的信息、它們的位置和它們的大小。編譯模塊212 可監(jiān)控編譯處理的進(jìn)程,即,源代碼202內(nèi)的哪個(gè)語(yǔ)言結(jié)構(gòu)目前由編譯器210處理。簽名相 關(guān)的占位符的插入保留給予編譯器210的原始高級(jí)語(yǔ)言代碼的邏輯功能。編譯器210意識(shí) 到優(yōu)化階段不會(huì)以破壞ISS的錯(cuò)誤檢查能力的方式來(lái)修改或移動(dòng)插入的占位符,例如通過(guò) 在循環(huán)不變式優(yōu)化期間在循環(huán)外部提升(hoi St )簽名更新。
經(jīng)編譯的代碼可為機(jī)器語(yǔ)言代碼。占位符插入組件可以被配置為選擇至少一個(gè)指 令簽名相關(guān)的占位符,以便至少一個(gè)指令簽名相關(guān)的占位符的大小等于最終在經(jīng)編譯的代 碼中取代至少一個(gè)指令簽名相關(guān)的占位符的機(jī)器語(yǔ)言指令的序列或機(jī)器語(yǔ)言指令的大小。
作為對(duì)于結(jié)合編譯器210以高級(jí)語(yǔ)言(諸如,C)寫(xiě)入的源文件的替代,程序員也可 以選擇以匯編語(yǔ)言編寫(xiě)源文件205,然后其可由匯編器216處理。匯編器216還生成對(duì)象 文件226和可選的列表文件218。在圖2中,匯編器216并未包括向匯編器216添加指令 簽名特定處理支持的模塊。因此,程序員自己將任何指令簽名相關(guān)的占位符添加到匯編器 216中,例如經(jīng)由在其發(fā)生的程序點(diǎn)處寫(xiě)入預(yù)定二進(jìn)制代碼的宏。雖然圖2中未示出,但是 匯編器216通常會(huì)包括提供類似編譯模塊212功能的匯編模塊或與其交互。
根據(jù)是否旨在通過(guò)對(duì)象文件222生成可執(zhí)行程序或軟件庫(kù)文件,對(duì)象文件222被 饋送至庫(kù)管理器230或連接器/定位器240。以類似的方式,由匯編器216創(chuàng)建的對(duì)象文 件226可被饋送至庫(kù)管理器230或連接器/定位器240。此外,一個(gè)或多個(gè)庫(kù)文件可供應(yīng) 至庫(kù)管理器230或連接器/定位器240。庫(kù)管理器230輸出庫(kù)文件232。連接器/定位器 240輸出ELF (可執(zhí)行和可鏈接文件)圖像246。連接器/定位器240可使用分散文件244 作為另一個(gè)輸入,用于鏈接和定位處理(其在加載所產(chǎn)生的ELF圖像246時(shí),基本上確定了 處理器的存儲(chǔ)器布局是如何組織的)。連接器/定位器240包括能夠產(chǎn)生可選的映射文件 247的指令流簽名(ISS)擴(kuò)展242。
除了分別位于編譯器210和連接器/定位器242中的指令簽名相關(guān)的擴(kuò)展212和 242之外,直至圖2中的水平虛線表示的點(diǎn),編譯和鏈接環(huán)境大致等于標(biāo)準(zhǔn)構(gòu)建流。
ELF圖像246仍然包含由編譯模塊212插入的指令簽名相關(guān)的占位符。為了將這 些占位符轉(zhuǎn)換成針對(duì)處理器(程序會(huì)在其上被最終運(yùn)行)來(lái)說(shuō)有用的指令或數(shù)據(jù),指令簽名 生成器250處理ELF圖像246,以創(chuàng)建經(jīng)修改的ELF圖像256。在經(jīng)修改的ELF圖像256中, 指令簽名相關(guān)的占位符已被對(duì)應(yīng)于占位符發(fā)生的程序點(diǎn)(即,簽名位置)的簽名值取代。指 令簽名生成器250 (也稱為“(靜態(tài))代碼檢查器”)在經(jīng)編譯的代碼中搜索占位符。此外,指 令簽名生成器250可執(zhí)行基本塊分析和默認(rèn)路徑分析,從而找到經(jīng)由哪個(gè)指令序列可以到 達(dá)占位符的程序點(diǎn),作為確定該程序點(diǎn)處的簽名值。或者,指令簽名生成器250可以從(例 如)編譯器210或連接器/定位器240中以列表文件214或映射文件247的形式接收相應(yīng) 的基本塊和默認(rèn)路徑信息。以基本塊和默認(rèn)路徑分析或信息和初始簽名值為基礎(chǔ),指令簽 名生成器250然后可在占位符發(fā)生的程序點(diǎn)處確定參考簽名。指令簽名生成器250可以按照當(dāng)運(yùn)行程序時(shí)可被執(zhí)行的順序從占位符到占位符來(lái)“艱難地通過(guò)(wade through)^LF圖像246,以便找到在進(jìn)行默認(rèn)路徑或非默認(rèn)路徑(如果存在)的情況下在兩個(gè)占位符程序點(diǎn)之間執(zhí)行哪個(gè)指令。在指令簽名生成器250輸出的ELF圖像256中,占位符已被指令簽名生成器250計(jì)算的簽名值替換。
經(jīng)修改的ELF圖像256輸入至后定位器260,該后定位器創(chuàng)建物理ELF圖像266和 /或十六進(jìn)制文件267。此外,后定位器260可使用一個(gè)或多個(gè)額外的ELF圖像262、衍生配置(derivative configuration) 263和可選的項(xiàng)目配置264??蛇x地,后定位器260可輸出映射文件265。
物理ELF圖像266或十六進(jìn)制文件267可在支持指令簽名跟蹤的處理器270上執(zhí)行。或者,物理ELF圖像266或十六進(jìn)制文件267可在模擬器(未示出)上執(zhí)行。
簽名編譯器的基本功能已經(jīng)在上面進(jìn)行簡(jiǎn)要地描述。更詳細(xì)地,簽名編譯器執(zhí)行標(biāo)準(zhǔn)編譯器的典型動(dòng)作,以本文所述的實(shí)施方式的特定動(dòng)作來(lái)補(bǔ)充。在解析和句法/語(yǔ)法分析的動(dòng)作期間,執(zhí)行確認(rèn)特定編譯指示和關(guān)鍵字的額外動(dòng)作??赡艿年P(guān)鍵字的例子為
ISS_0N (ISS 段開(kāi)始)
ISS_0FF (ISS 段結(jié)束)
ISS_START (激活I(lǐng)SS,即,使處理器ISS模塊開(kāi)始在簽名寄存器中計(jì)算所執(zhí)行的指令的總和)
ISS_ST0P (禁用 ISS)
ISS_CHECK (ISS 簽名檢查)
ISS_STATUS (ISS—致性檢查)
ISS_SUSPEND (ISS掛起,例如,在函數(shù)調(diào)用的情況下)
ISS_RESUME (ISS恢復(fù),例如,當(dāng)程序從對(duì)于調(diào)用函數(shù)進(jìn)行調(diào)用的函數(shù)返回)
ISS_SUSPENDRESTART (ISS 中斷處理)
編譯指示或關(guān)鍵字可以作為庫(kù)函數(shù)而解決。因此,可提供以下庫(kù)函數(shù)用于
void FCT_ISS_Start (const ref)
-該函數(shù)將參數(shù)ref的值加載到ISS_DATA寄存器。因此,對(duì)于ISS_DATA寄存器的寫(xiě)入,將簽名的當(dāng)前值設(shè)置為新的自變量ref,從而覆寫(xiě)以前的值。相反,對(duì)ISS_UPDATE 寄存器的寫(xiě)入執(zhí)行當(dāng)前簽名的增量變化。隨后,該函數(shù)使能指令流簽名跟蹤(例如,通過(guò)在 ISS_CTRL寄存器中設(shè)置相應(yīng)位)。
void FCT_lSS_StopO
-該函數(shù)關(guān)閉指令流簽名跟蹤。
void FCT_ISS_Check (const ref)
-在程序運(yùn)行期間,該函數(shù)檢查存儲(chǔ)于ISS_DATA寄存器中的當(dāng)前1BS_DATA值為預(yù)計(jì)值,即,等于參數(shù)ref值(其已經(jīng)在程序編譯期間由指令簽名生成器確定并插入適當(dāng)?shù)狞c(diǎn)處),分別輸入值的參考表中。如果當(dāng)前ISS_DATA值偏離常量參數(shù)ref的值,則觸發(fā)安全動(dòng)作。例如,指令簽名生成器可以將常量參數(shù)ref的值插入使處理器跳變至函數(shù)FCT_ISS_ Check的第一指令的跳變指令的點(diǎn)的點(diǎn)上游處,以便插入的值用作函數(shù)的參數(shù)ref。例如, 如果通過(guò)定義將函數(shù)參數(shù)置于處理器的特定寄存器中,則足以在跳變指令之前將指令簽名生成器確定的值寫(xiě)入該寄存器中。
void FCT_ISS_Status ()
-該函數(shù)檢查寄存器ISS_DATA的內(nèi)容。在檢測(cè)到不一致的情況下,觸發(fā)安全動(dòng)作。 該函數(shù)通常用于ISS關(guān)閉的區(qū)域,并檢查ISS_DATA寄存器的值是否匹配魔術(shù)常量值(magic constant value)。以這種方式,可以檢查是否已經(jīng)錯(cuò)誤地留下了 ISS保護(hù)的區(qū)域,例如,跳 過(guò)ISS_ST0P()函數(shù)。請(qǐng)注意,ISS_ST0P()留下具有魔術(shù)常量值的ISS-on域名。
int FCT_ISS_SuspendO
-該函數(shù)保存ISS_DATA和ISS_STATUS寄存器的當(dāng)前內(nèi)容,例如作為工作存儲(chǔ)器中 的局部變量。更具體地,該函數(shù)檢索ISS_DATA和ISS_STATUS寄存器的當(dāng)前值,作為然后可 以保存在工作存儲(chǔ)器中的單一整數(shù)值(其他格式也是可能的)。隨后,關(guān)閉指令流簽名跟蹤。
int FCT_ISS_SuspendRestart (const ref)
-該函數(shù)類似于先前的函數(shù)FCT_ISS_Suspend()。因此,它也可以保存ISS_DATA 和ISS_STATUS寄存器的當(dāng)前內(nèi)容,并開(kāi)啟指令流簽名跟蹤。此外,參數(shù)ref的值作為更新 值加載在當(dāng)前ISS_DATA值的頂部。
void FCT_ISS_Resume (save)
-該函數(shù)與以前介紹的兩個(gè)函數(shù)FCT_ISS_Suspend和FCT_ISS_Suspend相對(duì)。函 數(shù)FCT_ISS_Resume關(guān)閉指令流簽名跟蹤并(例如)根據(jù)先前存儲(chǔ)在工作存儲(chǔ)器中的變量來(lái) 恢復(fù)ISS_DATA和ISS_CTRL寄存器。例如存儲(chǔ)在工作存儲(chǔ)器中的ISS_DATA和ISS_CTRL寄 存器的值以單一參數(shù)save的形式被輸入該函數(shù)。
這些庫(kù)函數(shù)提供指令流簽名支持所需的函數(shù)。此外,大多數(shù)程序使用針對(duì)常用函 數(shù)的(標(biāo)準(zhǔn))庫(kù)。這些標(biāo)準(zhǔn)庫(kù)通常不提供指令流簽名跟蹤,從而在一個(gè)標(biāo)準(zhǔn)庫(kù)中未受保護(hù)的 函數(shù)調(diào)用可能會(huì)導(dǎo)致漏檢錯(cuò)誤,并因此導(dǎo)致安全漏洞。因此,如果需要更完整的覆蓋(包括 運(yùn)行庫(kù)調(diào)用),則按照指令流簽名支持的第二組運(yùn)行庫(kù)是必要的。通過(guò)由簽名編譯器(編譯 器210和編譯模塊212)和/或指令簽名生成器250產(chǎn)生的簽名控制信息來(lái)控制結(jié)合器/ 連接器(binder/linker),其中結(jié)合器/連接器在指令簽名保護(hù)的代碼段內(nèi)使用指令簽名 保護(hù)的庫(kù)函數(shù)。特別地,語(yǔ)言結(jié)構(gòu)識(shí)別器被配置為識(shí)別對(duì)其使能指令簽名支持的受保護(hù)的 程序代碼段。編譯模塊還包括庫(kù)調(diào)用信息收集器,其被配置為收集在受保護(hù)的程序代碼段 中發(fā)生的與軟件庫(kù)調(diào)用相關(guān)的庫(kù)調(diào)用信息,并將該庫(kù)調(diào)用信息提供給隨后的連接處理期間 使用。
編譯器210通常執(zhí)行基本塊分析。優(yōu)選地,編譯器210也執(zhí)行默認(rèn)的路徑分 析。作為額外的動(dòng)作,編譯模塊212可根據(jù)針對(duì)以下各項(xiàng)的規(guī)則插入隱式簽名指令a) do-whiIe-1oop 結(jié)構(gòu);b) while-do-loop 結(jié)構(gòu);c) if-then-else 結(jié)構(gòu);d)各種多轉(zhuǎn)換結(jié)構(gòu) (multiple switch construct)。在標(biāo)記為指令簽名保護(hù)的代碼段(例如,關(guān)鍵字ISS_0N和 ISS_0FF之間的代碼段)中進(jìn)行這些插入。語(yǔ)言結(jié)構(gòu)識(shí)別器213可被配置為識(shí)別在對(duì)其使 能指令簽名支持的高級(jí)語(yǔ)言源代碼中受保護(hù)的程序代碼段的開(kāi)始和結(jié)束。占位符插入組件 可被配置為使用相應(yīng)的保護(hù)段識(shí)別的結(jié)果,以便激活在受保護(hù)的程序代碼段內(nèi)插入至少一 個(gè)指令簽名相關(guān)的占位符,并禁用在非保護(hù)的程序代碼段內(nèi)的占位符插入。
由編譯模塊212 (或一旦由編譯模塊212進(jìn)行相應(yīng)的邀請(qǐng)之后由編譯器210)進(jìn)行 的其它額外的動(dòng)作是在由編譯指示和/或關(guān)鍵字定義的程序點(diǎn)處顯式簽名指令的插入
a)打開(kāi) ISS (ISS_START)(也見(jiàn)上文)
b)關(guān)閉 ISS (ISS_ST0P)(也見(jiàn)上文)
c) ISS簽名檢查
d)子函數(shù)
e)針對(duì)子函數(shù)的入口點(diǎn)(ISS_UPDATE)
影響編譯器210的另一個(gè)問(wèn)題是典型的編譯器在編譯代碼時(shí)執(zhí)行的優(yōu)化。特別是 以下兩種情況可能需要編譯器210的優(yōu)化行為的適應(yīng)循環(huán)不變式優(yōu)化和ISS函數(shù)調(diào)用。
關(guān)于循環(huán)不變式優(yōu)化,編譯器210可以得出這樣的結(jié)論循環(huán)內(nèi)的指令相關(guān)簽名 的占位符顯然未受循環(huán)的影響,且實(shí)際上可被移動(dòng)到循環(huán)前面,以便減少占位符的“執(zhí)行” 數(shù)量。然而,在這種情況下,當(dāng)每循環(huán)迭代構(gòu)成新的條件分支時(shí),占位符不會(huì)被優(yōu)化,而仍然 保持在循環(huán)中。
一些ISS函數(shù)具有由指令簽名生成器250補(bǔ)丁的參數(shù)。指令簽名生成器250假定 以下代碼(翻譯成匯編語(yǔ)言)
-·.
-M0Vff<Rd>, #<const>
-BL FCT_ISS_Start
-·.
MOVW將常量字值#〈const>移動(dòng)至寄存器Rd。然后,使用指令“BLFCT_ISS_Start” 使程序(無(wú)條件)跳變到標(biāo)簽FCT_ISS_Start。這兩個(gè)指令通常須是原子的,且尤其必須產(chǎn) 生獨(dú)立于參數(shù)長(zhǎng)度的MOVW指令。
關(guān)于代碼優(yōu)化,占位符插入組件215可被配置為驗(yàn)證編譯器210的代碼優(yōu)化是否 與至少一個(gè)指令簽名相關(guān)的占位符沖突。一旦驗(yàn)證或確定沖突,可阻止編譯器210執(zhí)行影 響至少一個(gè)指令簽名相關(guān)的占位符的編譯代碼優(yōu)化。
為了緩解ISS補(bǔ)丁和參考值計(jì)算,編譯器/連接器210/240將在(.elf)文件246 的.debug_info DWARF節(jié)中提供額外信息。
-關(guān)于何為代碼或常數(shù)的信息;
-關(guān)于在何處使能ISS的信息,例如,經(jīng)由#pragmaFCT_ISS ON ;
-所有占位符和相應(yīng)地址的列表;
-何處插入單板調(diào)用(veneercall)(涉及多個(gè)后續(xù)分支指令的調(diào)用)的信息;
-有關(guān)在多個(gè)機(jī)器語(yǔ)言之間切換的信息;
-有關(guān)尾部?jī)?yōu)化(一個(gè)函數(shù)運(yùn)行至另一個(gè))的信息;
-關(guān)于表在多重轉(zhuǎn)換中的大小的信息;
使用分支表指令,這在多個(gè)架構(gòu)(如TBB指令)中可用;
-代碼區(qū)的地址范圍;
-使能指令簽名跟蹤(例如,針對(duì)在連接和/或結(jié)合期間要被使用的正確庫(kù)函數(shù)) 的區(qū)的地址范圍;
-(全部)占位符插入的地址;
-有關(guān)函數(shù)指針的信息;
-有關(guān)函數(shù)的信息;
-有關(guān)函數(shù)結(jié)束的(地址)信息;
-有關(guān)switch-case 的信息。
為了能夠提供額外的指令流簽名信息,連接器240必須擴(kuò)展(例如,通過(guò)擴(kuò)展 242),從而向(例如)占位符列表提供所需的地址。
圖3示出說(shuō)明了針對(duì)指令簽名支持的(標(biāo)準(zhǔn))編譯器210和編譯模塊212的交互的 示意性框圖。如圖2中所示,編譯器210接收包括如通過(guò)用于源代碼的高級(jí)編程語(yǔ)言提供 的多個(gè)語(yǔ)言結(jié)構(gòu)的源代碼202。一些語(yǔ)言結(jié)構(gòu)與指令簽名支持相關(guān),諸如條件分支、函數(shù)調(diào) 用(特別是在運(yùn)行期間函數(shù)地址是未知的函數(shù)),以及用于在程序運(yùn)行期間控制和驗(yàn)證指令 簽名的專用指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)。
語(yǔ)言結(jié)構(gòu)可以從編譯器210通過(guò)至編譯模塊212,該模塊可檢查語(yǔ)言結(jié)構(gòu)是否會(huì) 引起指令簽名相關(guān)的占位符的插入。為此,編譯模塊212包括語(yǔ)言結(jié)構(gòu)識(shí)別器213。在已檢 測(cè)到指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)的情況下,語(yǔ)言結(jié)構(gòu)識(shí)別符213可通知占位符插入組件215。 特別的是,語(yǔ)言結(jié)構(gòu)識(shí)別器213可提供有關(guān)簽名相關(guān)的語(yǔ)言結(jié)構(gòu)位于源文件何處(例如,通 過(guò)行號(hào))和簽名相關(guān)的語(yǔ)言結(jié)構(gòu)類型的信息。
除了指令簽名相關(guān)的占位符的自動(dòng)插入之外,編譯器210和/或編譯模塊212可 進(jìn)一步提供標(biāo)準(zhǔn)代碼生成的適應(yīng),以將占位符保持在恰當(dāng)?shù)奈恢谩4送?,編譯器210和/或 編譯模塊212可進(jìn)一步提供附加的信息,使指令簽名生成器250更可靠。如果可能的話,編 譯器210 (其對(duì)編譯器210增加指令簽名支持)的擴(kuò)展應(yīng)該對(duì)代碼生成的影響最小,且高級(jí) 語(yǔ)言的代碼應(yīng)該在沒(méi)有特定代碼(除了使用指令流簽名庫(kù)函數(shù)之外)適應(yīng)的情況下工作。
編譯器210和/或編譯模塊212可以針對(duì)ISS庫(kù)函數(shù)進(jìn)行基本的語(yǔ)法檢查??梢?檢查以下規(guī)則
-在一個(gè)源文件的代碼流內(nèi)FCT_ISS_StopO后面跟著FCT_ISS_Start O ;
-FCT_ISS_Suspend()和 FCT_ISS_SuspendRestartO 后面跟著 FCT_ISS_ Resume O ;
-針對(duì)相應(yīng)的FCT_ISS_Suspend O 或 FCT_ISS_SuspendRestart O,僅允許一個(gè) FCT_ISS_ResumeO。
然后,占位符插入組件215可確定要插入到編譯代碼222或246的占位符。例如, 占位符插入組件215可確定占位符的(二進(jìn)制)值,其大小及其確切位置(上游、下游或在由 編譯器210響應(yīng)指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)所產(chǎn)生的編譯代碼的標(biāo)準(zhǔn)指令內(nèi))。然后,該占位 符信息可被發(fā)送回使用它插入到編譯代碼的編譯器210。可一步步進(jìn)行源代碼202的編譯 和指令簽名相關(guān)的占位符的插入,也就是說(shuō),當(dāng)編譯處理進(jìn)行時(shí),由編譯器210將新的占位 符插入目前正在考慮的程序點(diǎn)。
在編譯代碼222或246中,占位符插入編譯代碼的其余部分,特別是標(biāo)準(zhǔn)的編譯指 令。
對(duì)于由表明代碼的ISS使能部分的開(kāi)始和結(jié)束的關(guān)鍵字或編譯指示封住的函數(shù) 和代碼序列,編譯器210可根據(jù)下面介紹的一些基本規(guī)則自動(dòng)插入指令簽名相關(guān)的占位 符。
對(duì)于條件代碼序列,自動(dòng)插入可如下為了處理非默認(rèn)路徑,編譯器210須為每個(gè) 條件指令插入指令簽名相關(guān)的占位符。所有條件序列(if-then-else、switch_case、while 循環(huán)、do while循環(huán)等)可減少到必須由編譯器210或編譯模塊212識(shí)別并進(jìn)行不同處理的兩種情況。
不需要編譯器210或編譯模塊212進(jìn)行默認(rèn)路徑分析。編譯器210或編譯模塊 212可在所有條件路徑中添加指令簽名相關(guān)的占位符。在不必要的指令簽名相關(guān)的占位符 的情況下,指令簽名生成器250可用NOP (無(wú)操作)補(bǔ)丁它們。
一般規(guī)則可能是編譯器210或編譯模塊212須將占位符插入在條件跳變后執(zhí)行的 下一條指令前面。然而,對(duì)于doihile循環(huán),編譯器210或編譯模塊212須直接將占位符 插入條件跳變的標(biāo)簽(控制流圖的回邊)。
編譯模塊212可進(jìn)一步包括數(shù)據(jù)庫(kù)接口,其被配置為查詢包括由語(yǔ)言結(jié)構(gòu)識(shí)別器 和占位符插入組件使用的多個(gè)可能的指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)和相應(yīng)的指令簽名相關(guān)的 占位符的數(shù)據(jù)庫(kù)。該數(shù)據(jù)庫(kù)也可能是編譯模塊212的一部分。該數(shù)據(jù)庫(kù)可能包括用于控制 占位符插入組件關(guān)于至少一個(gè)指令簽名相關(guān)的占位符的插入的至少一個(gè)插入規(guī)則(通常是 多個(gè)插入規(guī)則)。
圖4說(shuō)明了指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)如何通過(guò)兩階段處理(包括編譯源代碼202 和計(jì)算指令簽名)來(lái)處理。指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)可對(duì)應(yīng)于編譯代碼中的幾個(gè)指令(在所 示實(shí)例中為五個(gè)指令)。具有編譯模塊212的編譯器210被配置為將指令簽名相關(guān)的占位 符插入編譯代碼222中。可以看出,占位符插入第三和第四指令之間,這可由占位符插入組 件215所使用的占位符插入規(guī)則的數(shù)據(jù)庫(kù)中定義(見(jiàn)圖3)。此外,占位符插入組件215可導(dǎo) 致編譯器210插入多個(gè)標(biāo)準(zhǔn)指令中的一個(gè),例如,將常量值加載到處理器的寄存器,諸如稍 后由指令簽名生成器250計(jì)算的簽名值。具有插入的占位符的編譯代碼222表示連接指令 簽名增強(qiáng)的編譯器和隨后的指令簽名生成的編譯器接口數(shù)據(jù)結(jié)構(gòu)。
指令簽名生成器250被配置為檢測(cè)占位符,并確定適當(dāng)?shù)暮灻?其然后在占位 符的位置插入編譯代碼222)。指令簽名生成器250輸出具有指令簽名256的編譯代碼256。
圖5示出根據(jù)實(shí)施方式的指令簽名生成器250的示意性框圖。指令簽名生成器250 包括占位符識(shí)別器251、簽名計(jì)算器253,以及占位符替換器255。占位符識(shí)別器251被配置 為接收編譯代碼222或246 (例如,匯編代碼或機(jī)器代碼)并搜索表明占位符的模式。例如, 占位符可為實(shí)際上未由編譯器210或處理器(最終程序?qū)?huì)在其上運(yùn)行)使用的操作碼。無(wú) 效操作碼應(yīng)該在處理器執(zhí)行程序之前移除,以避免運(yùn)行錯(cuò)誤。占位符識(shí)別器251也可以或 者可替換地(例如)經(jīng)由占位符信息接口接收關(guān)于已插入由編譯模塊212提供的編譯代碼的 占位符(見(jiàn)圖4)的簡(jiǎn)要信息。當(dāng)存在時(shí),占位符信息接口可被配置為接收占位符信息(包括 有關(guān)占位符的輔助信息),并將輔助信息提供至簽名計(jì)算器253。輔助信息可包括以下各項(xiàng) 中的至少一個(gè)相對(duì)于編譯代碼中的多個(gè)分支點(diǎn)的表的大小、表示函數(shù)結(jié)束的存儲(chǔ)器地址、 包括有關(guān)插入編譯代碼的至少一個(gè)占位符及其占位符位置的信息的列表,以及表示在對(duì)其 使能指令簽名支持的編譯代碼中至少一個(gè)受保護(hù)的代碼段的開(kāi)始和結(jié)束的地址表。簽名計(jì) 算器253被配置為使用地址表用于確定簽名值。
一旦由占位符識(shí)別器251發(fā)現(xiàn)或產(chǎn)生占位符,有關(guān)占位符的信息就被轉(zhuǎn)發(fā)到簽名 計(jì)算器253。如上所述,簽名計(jì)算器253被配置為對(duì)目前處理的占位符位置計(jì)算實(shí)際的簽名 值。簽名值可為開(kāi)始值、更新值,或如本文之前所述的參考值。簽名計(jì)算器253可被配置為 基于計(jì)算出的簽名值對(duì)于編譯代碼執(zhí)行基本塊分析。
由簽名計(jì)算器253確定的簽名值和關(guān)于(例如)占位符位置的信息被提供至占位符替換器255 (其被配置為執(zhí)行用計(jì)算的簽名值代替占位符)。由占位符替換器255提供或產(chǎn) 生的編譯代碼段通常在編譯代碼中占有的空間等于指令簽名相關(guān)的占位符占有的空間。編 譯代碼段可包括處理器指令。占位符替換器255可被配置為從多個(gè)處理器指令中選擇特定 的處理器指令,并在該特定的處理器指令的基礎(chǔ)上產(chǎn)生編譯代碼段。
圖6示出根據(jù)實(shí)施方式的方法的示意性流程圖,其通常用于在高級(jí)語(yǔ)言源代碼的 編譯期間處理指令簽名相關(guān)的信息。
在動(dòng)作602中,識(shí)別高級(jí)語(yǔ)言源代碼中的指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)。這可以基于 對(duì)高級(jí)語(yǔ)言源代碼中關(guān)鍵字或編譯指示的識(shí)別而進(jìn)行。
在隨后的動(dòng)作604中,執(zhí)行與編譯處理的交互,以便將基于指令簽名相關(guān)的語(yǔ)言 結(jié)構(gòu)的至少一個(gè)指令簽名相關(guān)的占位符插入由編譯處理正在處理(或已經(jīng)處理)的編譯代 碼中。
雖然在設(shè)備的背景下描述了一些方面,但是這些方面也代表相應(yīng)方法的描述,其 中框或裝置對(duì)應(yīng)于方法步驟或方法步驟的特征。類似地,在方法步驟的背景下描述的方面 也代表相應(yīng)設(shè)備的相應(yīng)框或項(xiàng)或功能的描述。一些或所有的方法步驟可由(或使用)硬件設(shè) 備(例如微處理器、可編程計(jì)算機(jī)或電子電路)來(lái)執(zhí)行。在一些實(shí)施方式中,最重要的方法步 驟中的某一個(gè)或多個(gè)可以由這樣的設(shè)備來(lái)執(zhí)行。
根據(jù)某些實(shí)施要求,本發(fā)明的實(shí)施方式可以按照硬件或軟件實(shí)現(xiàn)。可使用具有存 儲(chǔ)于其上的電子可讀控制信號(hào)的數(shù)字存儲(chǔ)介質(zhì)執(zhí)行該實(shí)現(xiàn)方式,例如軟盤(pán)、DVD、藍(lán)光、CD、 ROM、PR0M、EPR0M、EEPROM或閃存,其與可編程計(jì)算機(jī)系統(tǒng)合作(或能夠與其合作),以便執(zhí)行 各個(gè)方法。因此,數(shù)字存儲(chǔ)介質(zhì)可為計(jì)算機(jī)可讀。
一些實(shí)施方式包括數(shù)據(jù)載體,其具有電子可讀控制信號(hào),其能夠與可編程計(jì)算機(jī) 系統(tǒng)合作,以便執(zhí)行本文所述的方法之一。
一般情況下,這里所描述的實(shí)施方式可以作為具有程序代碼的計(jì)算機(jī)程序產(chǎn)品來(lái) 實(shí)現(xiàn),當(dāng)計(jì)算機(jī)程序產(chǎn)品在計(jì)算機(jī)上運(yùn)行時(shí),程序代碼操作地執(zhí)行方法之一。例如,程序代 碼可存儲(chǔ)在機(jī)器可讀載體上。
其它實(shí)施方式包括存儲(chǔ)于機(jī)器可讀載體中的、用于執(zhí)行本文所述方法之一的計(jì)算 機(jī)程序。
換言之,因此,一個(gè)實(shí)施方式為計(jì)算機(jī)程序,其具有用于當(dāng)在計(jì)算機(jī)上運(yùn)行計(jì)算機(jī) 程序時(shí)執(zhí)行本文所述方法之一的程序代碼。
因此,其它實(shí)施方式為數(shù)據(jù)載體(或數(shù)字存儲(chǔ)介質(zhì),或計(jì)算機(jī)可讀介質(zhì)),其包括記 錄在其上的用于執(zhí)行本文所述方法之一的計(jì)算機(jī)程序。數(shù)據(jù)載體、數(shù)字存儲(chǔ)介質(zhì)或記錄介 質(zhì)通常是有形和/或非過(guò)渡的。
因此,其它實(shí)施方式為代表用于執(zhí)行本文所述方法之一的計(jì)算機(jī)程序的數(shù)據(jù)流或 信號(hào)序列。例如,該數(shù)據(jù)流或信號(hào)序列可被配置為例如經(jīng)由互聯(lián)網(wǎng)通過(guò)數(shù)據(jù)通信連接來(lái)傳 送。
其它實(shí)施方式包括處理裝置,例如計(jì)算機(jī)或可編程邏輯設(shè)備,其被配置或適應(yīng)以 執(zhí)行本文所述方法之一。
其它實(shí)施方式包括計(jì)算機(jī),其具有安裝在其上的用于執(zhí)行本文所述方法之一的計(jì) 算機(jī)程序。
其它實(shí)施方式包括設(shè)備或系統(tǒng),其被配置為將用于執(zhí)行本文所述的方法之一的計(jì) 算機(jī)程序轉(zhuǎn)移(例如,電子地或光學(xué)地)至接收器。例如,接收器可為計(jì)算機(jī)、移動(dòng)設(shè)備、存儲(chǔ) 設(shè)備等。例如,設(shè)備或系統(tǒng)可包括用于將計(jì)算機(jī)程序傳送到接收器的文件服務(wù)器。
在一些實(shí)施方式中,可編程邏輯裝置(例如現(xiàn)場(chǎng)可編程門(mén)陣列)可以用來(lái)執(zhí)行本文 所述方法的部分或全部功能。在一些實(shí)施方式中,現(xiàn)場(chǎng)可編程門(mén)陣列可與微處理器的合作, 以執(zhí)行本文所述方法之一。一般來(lái)說(shuō),優(yōu)選由任何硬件設(shè)備來(lái)執(zhí)行方法。
術(shù)語(yǔ),諸如“第一”、“第二”等用于描述各種元件、區(qū)域、部分等,且其并不旨在進(jìn)行 限制。在整個(gè)說(shuō)明書(shū)中,相同的術(shù)語(yǔ)指相同的元件。
如本文所使用的,術(shù)語(yǔ)“具有”、“包含”、“包括”等是開(kāi)放的術(shù)語(yǔ),其是指所述元件 和特征的存在,但是并不排除其他元件或特征。除非上下文中有明確的相反表述,否則冠詞 “一個(gè)”、“所述”旨在包括多個(gè)以及單個(gè)。
應(yīng)理解,除非另有特別注明,否則本文所述的各個(gè)實(shí)施方式的特征可互相組合。
雖然已經(jīng)在本文中說(shuō)明并描述了具體實(shí)施方式
,但是本領(lǐng)域的普通技術(shù)人員應(yīng)理 解,在不背離本發(fā)明的范圍的情況下,各種替代和/或等同的實(shí)現(xiàn)方式可取代所示和所描 述的特定實(shí)施方式。該申請(qǐng)旨在涵蓋本文所討論的具體實(shí)施方式
的任何調(diào)整或變化。因此, 預(yù)期本發(fā)明僅由權(quán)利要求和其等同物限制。
權(quán)利要求
1.一種用于對(duì)編譯器提供指令簽名支持的編譯模塊,所述編譯模塊包括 語(yǔ)言結(jié)構(gòu)識(shí)別器,被配置為在供應(yīng)至所述編譯器的高級(jí)語(yǔ)言源代碼中識(shí)別指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu);以及 占位符插入組件,被配置為與所述編譯器交互,從而將基于所述指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)的至少一個(gè)指令簽名相關(guān)的占位符插入由所述編譯器基于所述高級(jí)語(yǔ)言源代碼所處理的編譯代碼中。
2.根據(jù)權(quán)利要求1所述的編譯模塊,其中,所述簽名相關(guān)的占位符的所述插入保留了給予所述編譯器的原始的所述高級(jí)語(yǔ)言代碼的邏輯功能。
3.根據(jù)權(quán)利要求1所述的編譯模塊,還包括數(shù)據(jù)庫(kù)接口,被配置為查詢包括由所述語(yǔ)言結(jié)構(gòu)識(shí)別器和所述占位符插入組件使用的多個(gè)可能的指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)和相應(yīng)的指令簽名相關(guān)的占位符的數(shù)據(jù)庫(kù)。
4.根據(jù)權(quán)利要求3所述的編譯模塊,其中,多個(gè)所述可能的指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)包括以下各項(xiàng)中的至少一個(gè)條件跳變、if-then結(jié)構(gòu)、switch_case結(jié)構(gòu)、while-loop結(jié)構(gòu)、do-while結(jié)構(gòu)和專用指令簽名相關(guān)的關(guān)鍵字。
5.根據(jù)權(quán)利要求3所述的編譯模塊,其中,所述數(shù)據(jù)庫(kù)還包括至少一個(gè)插入規(guī)則,用于控制所述占位符插入組件關(guān)于所述至少一個(gè)指令簽名相關(guān)的占位符的所述插入。
6.根據(jù)權(quán)利要求1所述的編譯模塊,其中,所述編譯代碼是機(jī)器語(yǔ)言代碼,且其中所述占位符插入組件被配置為選擇所述至少一個(gè)指令簽名相關(guān)的占位符,使得所述至少一個(gè)指令簽名相關(guān)的占位符的大小等于在所述編譯代碼中最終取代所述至少一個(gè)指令簽名相關(guān)的占位符的機(jī)器語(yǔ)言指令序列或機(jī)器語(yǔ)言指令的大小。
7.根據(jù)權(quán)利要求1所述的編譯模塊,其中,所述至少一個(gè)指令簽名相關(guān)的占位符是以下各項(xiàng)之一用于參考簽名值的占位符、用于簽名更新值的占位符、以及用于指令簽名相關(guān)的指令的占位符。
8.根據(jù)權(quán)利要求1所述的編譯模塊,還包括占位符信息收集器,被配置為收集有關(guān)插入所述編譯代碼中的指令簽名相關(guān)的占位符的占位符信息并輸出所述占位符信息。
9.根據(jù)權(quán)利要求1所述的編譯模塊,其中,所述語(yǔ)言結(jié)構(gòu)識(shí)別器被配置為識(shí)別對(duì)其使能所述指令簽名支持的受保護(hù)的程序代碼段,且其中,所述編譯模塊還包括庫(kù)調(diào)用信息收集器,所述庫(kù)調(diào)用信息收集器被配置為收集與在所述受保護(hù)的程序代碼段中發(fā)生的軟件庫(kù)調(diào)用相關(guān)的庫(kù)調(diào)用信息,并提供所述庫(kù)調(diào)用信息用于隨后的連接處理使用。
10.根據(jù)權(quán)利要求1所述的編譯模塊,其中,所述語(yǔ)言結(jié)構(gòu)識(shí)別器被配置為在對(duì)其使能所述指令簽名支持的所述高級(jí)語(yǔ)言源代碼中識(shí)別受保護(hù)的程序代碼段的開(kāi)始和結(jié)束,且其中,所述占位符插入組件被配置為使用相應(yīng)的受保護(hù)段識(shí)別的結(jié)果,以便激活在所述受保護(hù)的程序代碼段中插入所述至少一個(gè)指令簽名相關(guān)的占位符,并禁用在非受保護(hù)的程序代碼段中插入所述至少一個(gè)指令簽名相關(guān)的占位符。
11.根據(jù)權(quán)利要求1所述的編譯模塊,其中,所述占位符插入組件進(jìn)一步被配置為驗(yàn)證所述編譯器的代碼優(yōu)化是否與所述至少一個(gè)指令簽名相關(guān)的占位符沖突,且在驗(yàn)證到?jīng)_突時(shí),阻止所述編譯器執(zhí)行影響所述至少一個(gè)指令簽名相關(guān)的占位符的所述編譯代碼的優(yōu)化。
12.一種指令簽名生成器,包括用于編譯代碼的輸入; 占位符識(shí)別器,被配置為在所述編譯代碼中識(shí)別指令簽名相關(guān)的占位符; 簽名計(jì)算器,被配置為針對(duì)在所述編譯代碼中發(fā)生所述指令簽名相關(guān)的占位符的程序點(diǎn)確定簽名值;以及 占位符替換器,被配置為基于所述程序點(diǎn)處的所述簽名值插入編譯代碼段。
13.根據(jù)權(quán)利要求12所述的指令簽名生成器,其中,所述編譯代碼是機(jī)器語(yǔ)言代碼和匯編代碼之一。
14.根據(jù)權(quán)利要求12所述的指令簽名生成器,其中,由所述占位符替換器產(chǎn)生的所述編譯代碼段在所述編譯代碼中占用的空間等于所述指令簽名相關(guān)的占位符所占用的空間。
15.根據(jù)權(quán)利要求12所述的指令簽名生成器,其中,所述編譯代碼段包括處理器指令,其中,所述占位符替換器被配置為從多個(gè)處理器指令中選擇特定的處理器指令,并在所述特定的處理器指令的基礎(chǔ)上產(chǎn)生所述編譯代碼段。
16.根據(jù)權(quán)利要求12所述的指令簽名生成器,其中,所述簽名計(jì)算器被配置為基于計(jì)算出的所述簽名值對(duì)所述編譯代碼執(zhí)行基本塊分析。
17.根據(jù)權(quán)利要求12所述的指令簽名生成器,還包括占位符信息接口,被配置為接收包括有關(guān)所述指令簽名相關(guān)的占位符的輔助信息的占位符信息,并將所述輔助信息提供至所述簽名計(jì)算器。
18.根據(jù)權(quán)利要求17所述的指令簽名生成器,其中,所述輔助信息包括以下各項(xiàng)中的至少一個(gè)與所述編譯代碼中的多個(gè)分支點(diǎn)相關(guān)的表的大小、表示函數(shù)結(jié)束的存儲(chǔ)器地址、包括有關(guān)插入所述編譯代碼的所述至少一個(gè)指令簽名相關(guān)的占位符及其占位符位置的信息的列表、以及表示在對(duì)其使能所述指令簽名支持的所述編譯代碼中至少一個(gè)受保護(hù)的代碼段的開(kāi)始和結(jié)束的地址表,且其中,所述簽名計(jì)算器被配置為使用所述地址表用于確定所述簽名值。
19.一種在高級(jí)語(yǔ)言源代碼的編譯處理期間用于處理指令簽名相關(guān)的信息的方法,所述方法包括 在所述高級(jí)語(yǔ)言源代碼中識(shí)別指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu);以及 與所述編譯處理交互,以便將基于所述指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)的至少一個(gè)指令簽名相關(guān)的占位符插入在所述高級(jí)語(yǔ)言源代碼的基礎(chǔ)上通過(guò)所述編譯處理所處理的編譯代碼中。
20.根據(jù)權(quán)利要求19所述的方法,其中,所述簽名相關(guān)的占位符對(duì)于所述編譯處理是透明的。
21.根據(jù)權(quán)利要求19所述的方法,進(jìn)一步包括 對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢,所述數(shù)據(jù)庫(kù)包括要在所述指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)的所述識(shí)別期間以及與所述編譯處理的交互期間要使用的多個(gè)可能的指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)和相應(yīng)的指令簽名相關(guān)的占位符。
22.根據(jù)權(quán)利要求21所述的方法,其中,多個(gè)所述可能的指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)包括以下各項(xiàng)中的至少一個(gè)條件跳變、if-then結(jié)構(gòu)、switch-case結(jié)構(gòu)、while-loop結(jié)構(gòu)、do-while結(jié)構(gòu)以及專用指令簽名相關(guān)的關(guān)鍵字。
23.根據(jù)權(quán)利要求21所述的方法,其中,所述數(shù)據(jù)庫(kù)還包括至少一個(gè)插入規(guī)則,用于控制所述至少一個(gè)指令簽名相關(guān)的占位符的所述插入。
24.根據(jù)權(quán)利要求19所述的方法,其中,所述編譯代碼是機(jī)器語(yǔ)言代碼,且其中選擇所述至少一個(gè)指令簽名相關(guān)的占位符,使得所述至少一個(gè)指令簽名相關(guān)的占位符的大小等于在所述編譯代碼中最終取代所述至少一個(gè)指令簽名相關(guān)的占位符的機(jī)器語(yǔ)言指令序列或機(jī)器語(yǔ)言指令的大小。
25.根據(jù)權(quán)利要求19所述的方法,其中,所述指令簽名相關(guān)的占位符是以下各項(xiàng)之一用于參考簽名值的占位符、用于簽名更新值的占位符、以及用于指令簽名相關(guān)的指令的占位符。
26.根據(jù)權(quán)利要求19所述的方法,進(jìn)一步包括 收集有關(guān)插入所述編譯代碼中的指令簽名相關(guān)的占位符的占位符信息;以及 輸出所述占位符信息。
27.根據(jù)權(quán)利要求19所述的方法,進(jìn)一步包括 識(shí)別對(duì)其使能所述指令簽名支持的受保護(hù)的程序代碼段; 收集與在所述受保護(hù)的程序代碼段中發(fā)生的軟件庫(kù)調(diào)用相關(guān)的庫(kù)調(diào)用信息;以及 提供所述庫(kù)調(diào)用信息用于隨后的連接處理使用。
28.根據(jù)權(quán)利要求19所述的方法,進(jìn)一步包括 在對(duì)其使能所述指令簽名支持的所述高級(jí)語(yǔ)言源代碼中識(shí)別受保護(hù)的程序代碼段的開(kāi)始和結(jié)束,作為受保護(hù)的段識(shí)別;以及 使用所述受保護(hù)的段識(shí)別的結(jié)果,以便激活在所述受保護(hù)的程序代碼段中插入所述至少一個(gè)指令簽名相關(guān)的占位符,并禁用在非受保護(hù)的程序代碼段中插入所述至少一個(gè)指令簽名相關(guān)的占位符。
29.根據(jù)權(quán)利要求19所述的方法,進(jìn)一步包括 驗(yàn)證所述編譯處理的代碼優(yōu)化是否與所述至少一個(gè)指令簽名相關(guān)的占位符沖突,且在驗(yàn)證到?jīng)_突時(shí),阻止所述編譯處理執(zhí)行影響所述至少一個(gè)指令簽名相關(guān)的占位符的所述編譯代碼的優(yōu)化。
30.一種計(jì)算機(jī)可讀的數(shù)字存儲(chǔ)介質(zhì),具有程序代碼的計(jì)算機(jī)程序存儲(chǔ)于其上,在計(jì)算機(jī)上運(yùn)行時(shí)所述程序代碼用于執(zhí)行在高級(jí)語(yǔ)言源代碼的編譯處理期間的處理指令簽名相關(guān)的信息的方法,所述方法包括 在所述高級(jí)語(yǔ)言源代碼中識(shí)別指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu);以及與所述編譯處理交互,從而將基于所述指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)的至少一個(gè)指令簽名相關(guān)的占位符插入由所述編譯處理基于所述高級(jí)語(yǔ)言源代碼所處理的編譯代碼中。
全文摘要
本發(fā)明涉及具有指令簽名支持的分布式編譯處理。其中,一種用于對(duì)編譯器提供指令簽名支持的編譯模塊,包括語(yǔ)言結(jié)構(gòu)識(shí)別器和占位符插入組件。該語(yǔ)言結(jié)構(gòu)識(shí)別器被配置為在供應(yīng)至編譯器的高級(jí)語(yǔ)言源代碼中識(shí)別指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)。占位符插入組件被配置為與編譯器交互,從而將基于指令簽名相關(guān)的語(yǔ)言結(jié)構(gòu)的至少一個(gè)指令簽名相關(guān)的占位符插入由所述編譯器基于高級(jí)語(yǔ)言源代碼所處理的編譯代碼中。
文檔編號(hào)G06F9/45GK103019799SQ201210246530
公開(kāi)日2013年4月3日 申請(qǐng)日期2012年7月16日 優(yōu)先權(quán)日2011年7月15日
發(fā)明者于爾根·迪維, 奔迪特·加梅爾, 斯特凡·曼格德 申請(qǐng)人:英飛凌科技股份有限公司