專利名稱:用于有限資源的微電路的代碼驗(yàn)證方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種驗(yàn)證用于有限資源的微電路、例如用于芯片卡中的代碼的方法,特別是用于驗(yàn)證確保代碼的完整性和無(wú)害性的方法。
被稱作芯片卡的電子微電路卡,被作為移動(dòng)數(shù)據(jù)處理媒介,用于其中大多數(shù)要求高度安全性的非常不同的應(yīng)用,特別是銀行業(yè)務(wù)、安全支付、進(jìn)入建筑物或安全區(qū)和電信。芯片卡的廣泛使用和它們的應(yīng)用的多樣性,目前趨向于使用開放的平臺(tái),諸如已知的名為“Java”的平臺(tái),其允許把與該平臺(tái)兼容的應(yīng)用程序加載到電子數(shù)據(jù)處理機(jī)器的存儲(chǔ)器中。諸如Java的平臺(tái)有兩個(gè)優(yōu)點(diǎn),即被稱作“字節(jié)代碼”的中間代碼的標(biāo)準(zhǔn)化,以及其相對(duì)于機(jī)器的獨(dú)立性。任何Java程序因此能被編譯成被任何基于這樣一個(gè)平臺(tái)的機(jī)器普遍理解的一系列字節(jié)代碼指令。
由于智能卡或其它板上(on-board)系統(tǒng)是移動(dòng)的并與外部數(shù)據(jù)處理系統(tǒng)相關(guān)地被使用,或者執(zhí)行要么是未知的要么是非安全的原始字節(jié)代碼,因此有必要驗(yàn)證用于該卡或用于其它板上系統(tǒng)的程序的完整性和無(wú)害性。
美國(guó)專利US5,740,441中描述了一種用于驗(yàn)證Java類型的中間代碼的程序。這個(gè)專利中所描述的驗(yàn)證方法適用于諸如PC電腦的數(shù)據(jù)處理系統(tǒng),其中它們的處理器的計(jì)算能力和它們的隨機(jī)存取存儲(chǔ)器RAM(隨機(jī)存取存儲(chǔ)器)的容量明顯比芯片卡的大。處理器的能力和隨機(jī)存取存儲(chǔ)器的或永久性存儲(chǔ)器ROM(只讀存儲(chǔ)器)的容量,取決于內(nèi)嵌的硅的表面積。由于芯片卡一方面必須符合機(jī)械約束條件(特別是轉(zhuǎn)矩(torsion)和曲率(flexion)),另一方面必須保證合理的服務(wù)壽命,因此它們的硅表面一般不超過(guò)25mm2。芯片卡的存儲(chǔ)器通常有大約8K字節(jié)的容量,因此遠(yuǎn)遠(yuǎn)低于當(dāng)前市場(chǎng)上銷售的最低性能的個(gè)人電腦所能用的RAM的容量。
有幾種用于驗(yàn)證在存儲(chǔ)容量非常有限的裝置中的字節(jié)代碼的解決方案。
這些方法的其中之一包括向代碼添加一個(gè)預(yù)先計(jì)算算法的結(jié)果,該算法然后將被字節(jié)代碼驗(yàn)證器再次執(zhí)行。例如,PCC(證明載送代碼)方法或者它的一個(gè)使內(nèi)嵌的檢驗(yàn)器能使用更簡(jiǎn)單的算法的變體,就可能是這樣。諸如任何Java小應(yīng)用程序之類的程序,不包括補(bǔ)充的PCC代碼,因此不能被微電路驗(yàn)證。采用這些方法的微電路的使用范圍因此是有限的。
另一個(gè)方法包括在裝置的外部修改要被驗(yàn)證的程序的中間代碼,以便在不導(dǎo)致降低可靠性的情況下使驗(yàn)證方法更容易,如國(guó)際專利申請(qǐng)WO0114958A2中所描述的那樣。在這個(gè)申請(qǐng)中,描述了一種驗(yàn)證Java類型的程序的方法,其中,先在外部數(shù)據(jù)處理系統(tǒng)中通過(guò)所謂的“規(guī)格化”方法修改中間代碼,然后把這個(gè)修改過(guò)的代碼傳送到板上系統(tǒng)中。在這個(gè)規(guī)格化期間,將各類型的實(shí)際寄存器再分配到一個(gè)虛擬寄存器,這個(gè)寄存器中的每個(gè)寄存器單元只定義一個(gè)類型,就是說(shuō),虛擬寄存器是單態(tài)的(monomorphic)。這個(gè)修改因此使得有可能大大地降低在驗(yàn)證方法期間存儲(chǔ)一個(gè)多態(tài)(polymorphous)寄存器的不同類型所需的存儲(chǔ)器消耗。如果驗(yàn)證這個(gè)修改的代碼的方法成功地結(jié)束,修改的代碼然后就被板上系統(tǒng)執(zhí)行。這個(gè)方法的缺點(diǎn)之一是,不可能絕對(duì)地保證,在外部系統(tǒng)中的修改的代碼對(duì)應(yīng)于原始的代碼、并且將被板上系統(tǒng)正確地執(zhí)行。此外,按照前述的專利申請(qǐng)中所描述的方法執(zhí)行修改的代碼,限制了對(duì)程序的某些計(jì)算優(yōu)化技術(shù)的使用。
總之,驗(yàn)證旨在用于有限資源的微電路中的Java中間代碼(字節(jié)代碼)的傳統(tǒng)方法,可能也有增加要向微電路發(fā)送的信息量、需要在與芯片卡通信的外部數(shù)據(jù)處理系統(tǒng)中實(shí)現(xiàn)和執(zhí)行相對(duì)復(fù)雜的軟件、或者限制對(duì)程序的某些計(jì)算優(yōu)化技術(shù)的使用等缺點(diǎn)。
鑒于以上問(wèn)題,本發(fā)明的目的之一是提供一種驗(yàn)證要在一個(gè)具有有限資源的微電路的對(duì)象中被執(zhí)行的中間代碼的方法,該方法是可靠的,并且對(duì)微電路的存儲(chǔ)器資源(特別是易失性存儲(chǔ)器或者可以在微電路的讀或?qū)懩J较略L問(wèn)的其它存儲(chǔ)器)的占用是經(jīng)濟(jì)的。
有益是的是提供一種要在一個(gè)具有有限資源的微電路的對(duì)象中被執(zhí)行的驗(yàn)證方法,它不危害中間代碼的執(zhí)行,并且不限制用于優(yōu)化中間代碼的計(jì)算的技術(shù)的使用。
有益是的是提供一種要在一個(gè)具有有限資源的微電路的對(duì)象中被執(zhí)行的驗(yàn)證方法,它具有對(duì)諸如Java或諸如Javacard之類的變體的給定平臺(tái)的較廣的應(yīng)用范圍。
降低對(duì)對(duì)象的微電路的計(jì)算資源的使用也是有益的。
減少實(shí)現(xiàn)要被驗(yàn)證的程序的驗(yàn)證所需的時(shí)間也是有益的。
本發(fā)明的各目的是由按照權(quán)利要求1的方法實(shí)現(xiàn)的。
在本發(fā)明中,一種驗(yàn)證能被與外部數(shù)據(jù)處理系統(tǒng)相連接的有限資源的微電路執(zhí)行的中間代碼的方法包含修改中間代碼的步驟(其中包含將各類型的實(shí)際寄存器再分配到單態(tài)類型的虛擬寄存器,并且構(gòu)造一個(gè)其指令訪問(wèn)虛擬寄存器的再分配的代碼,以及在有限資源的微電路中驗(yàn)證該再分配的代碼的步驟,其特征在于,如果在微電路中該再分配的代碼的驗(yàn)證成功,則在有限資源的微電路中安裝原始的中間代碼以供執(zhí)行。
在第一實(shí)施例中,可以先在外部數(shù)據(jù)處理系統(tǒng)中進(jìn)行原始中間代碼的修改,然后再把它加載入有限資源的微電路中,該修改包含生成一個(gè)再分配部分,其包括一個(gè)定義將實(shí)際存儲(chǔ)器類型的數(shù)據(jù)再分配到單態(tài)虛擬寄存器類型的數(shù)據(jù)的再分配表。在這個(gè)實(shí)施例中,驗(yàn)證方法包含對(duì)再分配部分的驗(yàn)證,如果成功,則還包含對(duì)再分配的代碼的驗(yàn)證,再分配的代碼要么是在驗(yàn)證再分配部分的方法期間、要么是在再分配部分的驗(yàn)證之后被構(gòu)造的。如果對(duì)再分配的代碼的驗(yàn)證成功地結(jié)束,則安裝原始字節(jié)代碼以供執(zhí)行,原始字節(jié)代碼要么被存儲(chǔ)在微電路的一個(gè)可以在讀和寫模式下訪問(wèn)的永久存儲(chǔ)器中,要么被從外部系統(tǒng)中加載。在后一種情況下,為了保證從外部系統(tǒng)安裝的原始字節(jié)代碼對(duì)應(yīng)于在原始字節(jié)代碼的第一次加載期間被驗(yàn)證的原始代碼,執(zhí)行對(duì)原始中間代碼的散列(hashing)計(jì)算,并將其與要在驗(yàn)證方法之后被再安裝的原始中間代碼的散列計(jì)算的結(jié)果作比較。
在另一個(gè)實(shí)施例中,計(jì)算再分配的代碼的再分配和構(gòu)造的步驟可在有限資源的微電路中執(zhí)行,在驗(yàn)證方法之前被加載到微電路中的原始中間代碼被執(zhí)行并被存儲(chǔ)在微電路的存儲(chǔ)器中,例如EEPROM(電可擦可編程只讀存儲(chǔ)器)類型的、可以在讀和寫模式下訪問(wèn)的永久存儲(chǔ)器中。
有益地,用于的驗(yàn)證的再分配的代碼的生成使得有可能生成一個(gè)在中間代碼的驗(yàn)證期間減少對(duì)微電路的易失性存儲(chǔ)器的消耗的單態(tài)類型的寄存器。然而在驗(yàn)證方法之后安裝用于執(zhí)行的原始中間代碼,確實(shí)使得有可能避免與執(zhí)行修改的中間代碼相關(guān)的任何問(wèn)題并且也允許使用優(yōu)化的計(jì)算技術(shù)。
本發(fā)明的其它有益特征將體現(xiàn)在權(quán)利要求書、下文給出的本發(fā)明各實(shí)施例的詳細(xì)說(shuō)明以及附圖中。
圖1表示一個(gè)說(shuō)明按照本發(fā)明第一實(shí)施例的中間代碼驗(yàn)證方法的各步驟的連結(jié)的流程圖;圖2是中間代碼(字節(jié)代碼)的指令以及與該中間代碼的指令相關(guān)聯(lián)的再分配表的簡(jiǎn)化表示;圖3是本發(fā)明一個(gè)實(shí)施例中的帶有其再分配表的中間代碼的一個(gè)實(shí)例的簡(jiǎn)化表示;圖4表示一個(gè)說(shuō)明在驗(yàn)證再分配表期間的各步驟的連結(jié)的流程圖;圖5是中間代碼的“def r”類型的指令的當(dāng)前再分配表的分配和更新的簡(jiǎn)化表示,該指令是一個(gè)定義與該指令相關(guān)聯(lián)的實(shí)際寄存器中的值的指令。
圖6是“use r”類型的指令的當(dāng)前再分配表的分配和更新的簡(jiǎn)化表示,該指令是一個(gè)使用與當(dāng)前指令相關(guān)聯(lián)的寄存器中的值r的指令。
圖7是中間代碼的“brch”類型的指令的當(dāng)前再分配表的分配和更新的簡(jiǎn)化表示,該指令是一個(gè)用于切換到至少兩個(gè)指令的指令。
圖8是“nop”類型的指令的當(dāng)前再分配表的分配和更新的簡(jiǎn)化表示,該指令是一個(gè)不包括對(duì)與當(dāng)前指令相關(guān)聯(lián)的寄存器的任何操作的指令。
圖9是“return”類型的指令的當(dāng)前再分配表的分配和更新的簡(jiǎn)化表示。
圖10表示一個(gè)說(shuō)明按照本發(fā)明第二實(shí)施例的中間代碼驗(yàn)證方法的各步驟的連結(jié)的流程圖。
參看圖1,圖中表示按照本發(fā)明第一實(shí)施例的一種驗(yàn)證諸如Java或Javacard字節(jié)代碼的中間代碼的方法的步驟。一個(gè)有限資源的微電路(特別是用于諸如芯片卡的板上系統(tǒng)的有限資源的微電路)連接到一個(gè)用于在微電路中加載和執(zhí)行一個(gè)諸如Java或Javacard小應(yīng)用程序的程序的外部數(shù)據(jù)處理系統(tǒng)(以下稱作“外部系統(tǒng)”)。外部系統(tǒng)實(shí)現(xiàn)Java程序的編譯并把它轉(zhuǎn)換成一個(gè)文件.cap,即可由微電路執(zhí)行的中間代碼(字節(jié)代碼)。
在第一實(shí)施例中,向原始中間代碼增加一個(gè)包含如圖2和3中所示的再分配表T的再分配部分。這個(gè)再分配部分是由外部系統(tǒng)通過(guò)諸如“圖形染色”(graphcolouring)方法的已知再分配計(jì)算方法生成的。
通過(guò)圖形染色的再分配計(jì)算是眾所周知的,其例如存在于并且被用于在國(guó)際專利申請(qǐng)WO0114958A2中所描述的驗(yàn)證方法中。然而,在前述的申請(qǐng)中,原始中間代碼是通過(guò)所謂的“規(guī)格化”方法被修改的。因此,一方面,中間代碼的指令和寄存器被修改,使得寄存器是單態(tài)的,就是說(shuō),每個(gè)寄存器接收只代表一個(gè)類型的數(shù)據(jù);另一方面,在每個(gè)切換指令(switching instruction)時(shí),棧是空的。這個(gè)轉(zhuǎn)換使得有可能使驗(yàn)證方法是線性的并且避免由能夠接受代表不同類型的數(shù)據(jù)的寄存器(即多態(tài)寄存器)的存儲(chǔ)所必需的易失性存儲(chǔ)器(RAM)的高消耗。
在前述的已知方法中,如此修改的Java字節(jié)代碼被用于在驗(yàn)證后執(zhí)行程序。修改的代碼的執(zhí)行,一方面可能對(duì)執(zhí)行的可靠性有影響,另一方面限制使用已知的Java字節(jié)代碼的優(yōu)化技術(shù)的可能性,這種優(yōu)化技術(shù)例如用于減少執(zhí)行時(shí)間或者與外部系統(tǒng)的通信時(shí)間。
在本發(fā)明中,將原始中間代碼(字節(jié)代碼)以及再分配部分加載到有限資源的微電路中。原始中間代碼被存儲(chǔ)在微電路的存儲(chǔ)器(例如EEPROM類型的可以在讀和寫模式下訪問(wèn)的永久存儲(chǔ)器)中,而再分配部分被加載到微電路的易失性存儲(chǔ)器(RAM)中。加載之后,再分配部分被檢查(步驟110),如果成功,則繼續(xù)進(jìn)行再分配的代碼的構(gòu)造(步驟112),最后是驗(yàn)證再分配的代碼的步驟(步驟114),然后安裝存儲(chǔ)于永久存儲(chǔ)器中的存儲(chǔ)原始中間代碼以供執(zhí)行(步驟116)。如果驗(yàn)證再分配部分的方法或者驗(yàn)證再分配的代碼的方法失敗,則中間代碼被拒絕,并不被安裝以用于執(zhí)行。應(yīng)當(dāng)注意的是,再分配的代碼的構(gòu)造,可在驗(yàn)證再分配部分的方法期間進(jìn)行,就是說(shuō)可以合并步驟110和112。
以下將參照?qǐng)D2到9更詳細(xì)地說(shuō)明驗(yàn)證再分配部分的程序。
圖2以簡(jiǎn)化的方式表示了一系列中間代碼的指令PC以及類型數(shù)據(jù)的實(shí)際存儲(chǔ)器的再分配部分T。中間代碼的指令可以按照它們對(duì)對(duì)應(yīng)的類型數(shù)據(jù)寄存器的再分配的影響而被劃分成以下五個(gè)指令類別。
“def x”寄存器中的變量x的值(例如指令“sstore”、“astore”)被定義。
“use x”x被用在寄存器中(例如指令“sload”、“aload”)。
“nop”不對(duì)寄存器值進(jìn)行操作(例如指令“sxor”、“iadd”)。
“return”從方法退出(例如指令“areturn”、“sreturn”)。
“brch x y”切換到目標(biāo)指令x或y(例如指令“ifeq”、“ifscmpeq”)。
更具體地參看圖2和3,再分配部分T包含一個(gè)子表D和一個(gè)再分配表F,子表D含有對(duì)定義寄存器rx中的變量x的類型的每個(gè)指令(即類別為“def x”的指令)的再分配,再分配表F具有與實(shí)際寄存器相同的列數(shù)k以及與指令PC相同的行數(shù)S。表F是一個(gè)由從類型rx的實(shí)際數(shù)據(jù)寄存器到虛擬寄存器vy的再分配得到的表。相同類型的每個(gè)寄存器rx都被再分配到一個(gè)對(duì)應(yīng)于這個(gè)類型的單一的虛擬寄存器vy。其類型可能改變的實(shí)際寄存器(即多態(tài)寄存器)被再分配到對(duì)應(yīng)于這些寄存器的各種類型的各種虛擬寄存器。由于每個(gè)虛擬寄存器只定義一個(gè)類型,因而虛擬寄存器是單態(tài)的,也就是說(shuō)是這樣的變量,對(duì)于所述變量存在一個(gè)在中間代碼驗(yàn)證中自始至終保持有效的類型。
如果是單態(tài)的變量,驗(yàn)證算法就簡(jiǎn)單得多,因?yàn)閷?duì)于每個(gè)變量,只需要簡(jiǎn)單地尋找將在驗(yàn)證程序中自始至終有效的變量類型。定點(diǎn)計(jì)算事實(shí)上就是這樣一種情況,其中,變量的類型被專門限定,直到它保持不變。如果多態(tài)變量作為單態(tài)變量被提供給這樣一個(gè)算法,則該算法不成功。
用于驗(yàn)證再分配部分的程序使用一個(gè)當(dāng)前表F’(見(jiàn)圖3),其含有當(dāng)前指令(PC)的每個(gè)變量的類型,使得這個(gè)當(dāng)前表F’中含有的類型對(duì)應(yīng)于在再分配部分T的驗(yàn)證期間的當(dāng)前再分配中的變化。當(dāng)前表F’因此能由單一行和其數(shù)目等于實(shí)際寄存器的數(shù)目k的多個(gè)列表示。
如圖3中所示,在驗(yàn)證方法的開始,就是說(shuō),在指令PC1處,當(dāng)前再分配表中的數(shù)據(jù)被用類型“nil”初始化(圖4的步驟402)而不是類型“top”,其中類型“nil”是類型的格子結(jié)構(gòu)(trellis)中最小的元素,而類型“top”則組合所有的類型,就是說(shuō),是類型的格子結(jié)構(gòu)中最大的元素。下一步,讀第一個(gè)指令(圖4的步驟404),并且按照中間代碼的指令類別,執(zhí)行驗(yàn)證,緊接著,是當(dāng)前再分配表F’的更新,或者簡(jiǎn)單地是當(dāng)前再分配表的更新。
對(duì)于沒(méi)有對(duì)寄存器的操作的指令“nop”和返回“return”,驗(yàn)證算法簡(jiǎn)單地執(zhí)行再分配表的更新(圖4中分別為步驟412和414),分別如圖8和9所示。如果指令是“nop”類型的,更新只是簡(jiǎn)單地把類型數(shù)據(jù)(f’α,i)轉(zhuǎn)移到當(dāng)前再分配表中,就是說(shuō),類型數(shù)據(jù)對(duì)下一條指令PC+1保持不變。對(duì)于“return”類別的指令,更新在于對(duì)當(dāng)前分配表F’中緊接著的指令PC+1的再分配子表F的類型數(shù)據(jù)(f’α+1,i)的分配,如圖9中所示。
如果是定義指令“def”,則在含有所考慮的指令(PC)的再分配的子表D中的類型數(shù)據(jù)(dα)被分配到當(dāng)前再分配表F’的對(duì)應(yīng)寄存器,就是說(shuō),如果當(dāng)前指令PC定義一個(gè)寄存器(f,x)的值,則在表D中定義的再分配(dα=vy)被分配,并且更新當(dāng)前再分配表F’的寄存器(f’,x)。在這個(gè)更新期間,當(dāng)前再分配表中的其它值(f’,i至f’,x-1以及f’,x+1至f’,k)被保持,如圖5中所示。
如果指令的類別是“use rx”,則驗(yàn)證算法簡(jiǎn)單地檢查當(dāng)前再分配表F’的對(duì)應(yīng)寄存器(列x)的值是否等于作為類型的格子結(jié)構(gòu)中的最小元素的值“nil”。這個(gè)指令的更新只是保持當(dāng)前再分配表F’的類型數(shù)據(jù)(f’,i),如圖6中所示。
如果是個(gè)切換指令,則驗(yàn)證是比較當(dāng)前再分配表F’中對(duì)應(yīng)于當(dāng)前指令PCα的表中的類型數(shù)據(jù)(f’,i)與具有目標(biāo)指令PCβ和PCγ的再分配表F的類型數(shù)據(jù)(f’,i),如果不相等,則驗(yàn)證程序以失敗告終。然后通過(guò)把再分配表F的類型數(shù)據(jù)分配到當(dāng)前再分配表F’而把當(dāng)前再分配表F’更新為當(dāng)前再分配表F’。
下一個(gè)步驟(416)是檢查是否仍然還有要被讀取的指令,如果是,則遞增當(dāng)前指令的指針(步驟418),重復(fù)讀取指令的循環(huán)(步驟414),驗(yàn)證并更新當(dāng)前再分配,直到不再有要被讀取的指令。驗(yàn)證程序然后轉(zhuǎn)到構(gòu)造再分配的代碼的步驟(步驟112)和對(duì)再分配的代碼的驗(yàn)證(步驟114)。再分配的代碼的驗(yàn)證,遵循已知的驗(yàn)證方法。然而應(yīng)當(dāng)注意的是,可以在再分配部分的驗(yàn)證期間通過(guò)把指令所作用的變量改變?yōu)槠湓俜峙渲担鴺?gòu)造再分配的代碼(步驟110)。例如,如果一個(gè)定義指令“def r1”(見(jiàn)圖3)作用于被再分配到虛擬寄存器v1的寄存器r1,則再分配的代碼的指令變成“def v1”,使得它作用于虛擬類型數(shù)據(jù)寄存器而不是實(shí)際原始類型數(shù)據(jù)寄存器。
因此發(fā)現(xiàn),指令被線性地從第一個(gè)到最后一個(gè)指令被讀取,每個(gè)指令被類型解釋器(interpreter)執(zhí)行。
對(duì)于用于使用變量的指令(“use”),沒(méi)有對(duì)寄存器的任何操作(“nop”)或者返回操作(“return”),驗(yàn)證算法的行為與傳統(tǒng)檢驗(yàn)器的類似。
然而,必須保證在使用指令“usex”期間該指令所作用的變量“x”以前確實(shí)被定義過(guò),同時(shí)該變量可能在這個(gè)指令之前已經(jīng)在程序的另一個(gè)分支中被初始化。這個(gè)問(wèn)題是通過(guò)驗(yàn)證在用于一個(gè)定義指令“defx”的子表D中存儲(chǔ)的值專門限定了當(dāng)前再分配表F’中的變量x的以前的類型而解決的。為此,重要的是在程序的開始處,表F’的變量被初始化為“nil”,以便它們能被專門限定。
應(yīng)當(dāng)注意的是,對(duì)于切換指令“brch”,驗(yàn)證算法不對(duì)當(dāng)前再分配表F’做任何改變,而是前進(jìn)一個(gè)指令。
一旦到達(dá)中間代碼的結(jié)尾,程序就在開始處重新開始,一直到每個(gè)變量的類型都保持不變?yōu)橹埂.?dāng)某個(gè)代碼連同非單態(tài)的變量一起被提供給驗(yàn)證算法時(shí),驗(yàn)證算法失敗,因?yàn)樗鶕?jù)定義指令“def”驗(yàn)證子表D中的類型數(shù)據(jù)專門限定了已經(jīng)在當(dāng)前再分配表F’中存在的類型。一個(gè)通過(guò)單態(tài)驗(yàn)證并初始化其變量的類型數(shù)據(jù)的代碼必須被正確地確定類型,因?yàn)槊總€(gè)虛擬寄存器(v1)都只可能含有一個(gè)類型。換言之,類型解釋器驗(yàn)證一個(gè)變量的所有可能的使用都是符合其類型的,因此這是由對(duì)再分配表F進(jìn)行操作的指令PC通過(guò)一個(gè)單態(tài)驗(yàn)證的事實(shí)保證的。
如果在原始中間代碼中,任何使用指令“use x”使用與已經(jīng)能定義它的所有定義指令“def x”的相同的再分配,則再分配是有效的。就是說(shuō),在為驗(yàn)證而生成的代碼中,如果某個(gè)指令“use x”已經(jīng)被轉(zhuǎn)換成“use y”,則指令“def x”已經(jīng)被轉(zhuǎn)換成“def y”。
以上提出的有效性,可以通過(guò)歸謬法(reductio ad absurdam)來(lái)證明。假設(shè)有一個(gè)算法在代碼的結(jié)尾處結(jié)束的無(wú)效的再分配。如果再分配是無(wú)效的,則在變量x的再分配是變量z的指令“def x”的字段(field)中存在一個(gè)指令“use x”,而指令“def x”的變量x的再分配是變量y,其中y不同于變量z。存在原始中間代碼的一個(gè)指令序列“def x”、“i-1”、“i-2”、…、“i-k”、“use x”,其導(dǎo)致指令“def x”到“use x”經(jīng)過(guò)一個(gè)正確的執(zhí)行的流。該序列中沒(méi)有其它的指令“def x”,否則它就是定義指令“use x”的指令。所有其它的指令在算法的運(yùn)行期間保留寄存器x的當(dāng)前再分配。這是因?yàn)椋噶睢皀op”、“return”和“use”不改變當(dāng)前再分配,且切換指令“brch”保證切換后的再分配與切換前的再分配相同。
因此,上述指令序列與證明初始建議的有效性(即證明對(duì)象)的歸謬法相矛盾。
也有可能通過(guò)以下理由來(lái)證明,如果從原始中間代碼和從其有效的再分配表生成的中間代碼通過(guò)驗(yàn)證過(guò)程,則原始中間代碼也通過(guò)驗(yàn)證過(guò)程。假設(shè)在驗(yàn)證中間代碼的過(guò)程中,在易失性存儲(chǔ)器(RAM)中存儲(chǔ)有用于每個(gè)切換目標(biāo)的變量的類型以及一個(gè)當(dāng)前表和一個(gè)工作列表。用作為類型格子結(jié)構(gòu)的最大的元素的類型“top”對(duì)表進(jìn)行初始化。此外對(duì)于每個(gè)非參數(shù)化的(non-parameterised)變量用類型“top”以及對(duì)于參數(shù)化的變量用簽名的類型來(lái)初始化當(dāng)前表。驗(yàn)證算法以與工作列表中的該方法的入口點(diǎn)相關(guān)聯(lián)的指令開始。從工作列表中去除第一個(gè)指令。在這個(gè)指令的執(zhí)行之后從類型解釋器中計(jì)算新的當(dāng)前表,并將其與對(duì)應(yīng)于可能成功的指令的表統(tǒng)一。將表已經(jīng)改變了的指令增加到工作表中。如果到達(dá)一個(gè)空的工作列表,則中間代碼被成功地驗(yàn)證。如果類型的統(tǒng)一是不可能的,或者如果類型解釋器遇到一個(gè)與寄存器的表中的類型數(shù)據(jù)不相容的指令,則驗(yàn)證方法拒絕一個(gè)算法。
通過(guò)采取原始中間代碼的驗(yàn)證的任何步驟,假設(shè)到目前為止驗(yàn)證已經(jīng)正確地進(jìn)行,且當(dāng)前表和寄存器的內(nèi)容是可用的。起點(diǎn)也是來(lái)自這樣的假設(shè),即利用再分配的對(duì)中間代碼的驗(yàn)證的對(duì)應(yīng)步驟正確地進(jìn)行,并且已知再分配是有效的。為了結(jié)束這個(gè)證明,按照當(dāng)前指令區(qū)分幾種情形“nop”該指令不涉及變量,隨后的指令被傳送,而不作任何修改。驗(yàn)證過(guò)程不可能在指令“nop”上失敗。
“def x”以新的類型對(duì)當(dāng)前表進(jìn)行更新。驗(yàn)證過(guò)程不可能在“def”上失敗,因?yàn)樗鼜臈V腥∫粋€(gè)自變量,但是不涉及棧中的類型。
“return”驗(yàn)證正常地繼續(xù)。驗(yàn)證過(guò)程在這里不可能失敗。
“use x”如果類型解釋器判定變量x的類型與它的使用不相容,則驗(yàn)證過(guò)程可能失敗。這個(gè)再分配的有效性向我們確保變量x的再分配尚未在這個(gè)指令“use”和與之對(duì)應(yīng)的指令“def”之間改變。由于至此為止對(duì)再分配的代碼的驗(yàn)證是成功的,變量x的類型是與其使用相容的。驗(yàn)證過(guò)程因此成功地傳遞到該指令。
“brch x y”驗(yàn)證過(guò)程在當(dāng)前表于對(duì)應(yīng)于寄存器x的表統(tǒng)一(unification)或者與對(duì)應(yīng)于寄存器y的表統(tǒng)一時(shí)可能失敗。然而,再分配的有效性向我們確保在切換指令“brch”時(shí)的當(dāng)前再分配對(duì)于x和y是相同的。此外,再分配的代碼的驗(yàn)證對(duì)這個(gè)指令成功,因此對(duì)非再分配的中間代碼的驗(yàn)證也成功。
至于對(duì)中間代碼中的異常的處理,如果是在被一個(gè)異?!疤幚砥鳌北Wo(hù)的一部分代碼上,每個(gè)指令必須被認(rèn)為是到處理該異常的中間代碼部分的一個(gè)潛在的切換,就是說(shuō),當(dāng)前再分配必須與在異常再分配表中所給定的相同。盡管對(duì)這個(gè)異常的處理使得有可能確保確定類型(typing)的正確,但另一方面它是過(guò)于限制性的,因?yàn)樗荒芨淖冊(cè)谟赏粋€(gè)異常處理器保護(hù)的塊內(nèi)的變量的再分配。例如PC1def r1作為整數(shù)再分配r1→v1PC2def r1作為引用再分配r1→v2如果這兩個(gè)指令“def”都被相同的異?!疤幚砥鳌北Wo(hù),并且變量r1不被用于對(duì)異常的處理,則類型的確定是不受妨礙的,但是再分配表的驗(yàn)證算法則因?yàn)樽兞縭1在異常處理的輸入處只能有一個(gè)再分配而失敗。解決方案是創(chuàng)建一個(gè)模擬寄存器(artificial register)(稱作Top),它防止在Top處再分配的實(shí)際寄存器的使用。在該例中,向Top再分配異常處理的再分配的表中的寄存器r1就足夠了。向Top的再分配通過(guò)切換傳送,并且能在對(duì)應(yīng)于一個(gè)異常的處理的開始的再分配表中出現(xiàn)。
至于子例程的調(diào)用,有必要考慮它們導(dǎo)致在要被丟失的變量的指令“use”與指令“def”之間的連接這一事實(shí)。為了使再分配與子例程JSR/RET的調(diào)用相容,有必要增加一個(gè)再分配上下文系統(tǒng)。
參看圖10,在本發(fā)明的第二實(shí)施例中,完全在有限資源微電路中執(zhí)行對(duì)再分配和再分配的代碼的計(jì)算(步驟1010),接著是微電路中對(duì)再分配的代碼的驗(yàn)證的步驟1012,如果成功,則安裝原始中間代碼以供執(zhí)行(步驟1016)。有限資源微電路中對(duì)再分配的和再分配的代碼的計(jì)算可以按照已知的方法進(jìn)行,然而沒(méi)有必要進(jìn)行對(duì)再分配的代碼的優(yōu)化,因?yàn)樗皇怯糜趫?zhí)行的,而是只用于對(duì)中間代碼的完整性和無(wú)害性的驗(yàn)證。
中間代碼或者可以在第一次從外部系統(tǒng)加載時(shí)被存儲(chǔ)在可以在讀和寫模式下訪問(wèn)的永久性存儲(chǔ)器中,或者可以在驗(yàn)證后安裝,即對(duì)第一次加載應(yīng)用一個(gè)散列函數(shù),把結(jié)果存儲(chǔ)在微電路的存儲(chǔ)器中,并將其與從驗(yàn)證后加載的中間代碼中計(jì)算的散列值比較。
權(quán)利要求
1.一種驗(yàn)證能被與外部數(shù)據(jù)處理系統(tǒng)相連接的有限資源的微電路執(zhí)行的中間代碼的方法,包含修改中間代碼的步驟,其中包含把類型r的實(shí)際寄存器再分配到單態(tài)類型的虛擬寄存器v,以及構(gòu)造一個(gè)其指令PC訪問(wèn)虛擬寄存器v的再分配的代碼;以及在有限資源的微電路中驗(yàn)證該再分配的代碼的步驟,其特征在于,如果在微電路中對(duì)該再分配的代碼的驗(yàn)證成功,則在有限資源的微電路中安裝該原始中間代碼以供執(zhí)行。
2.按照權(quán)利要求1的方法,其特征在于,構(gòu)造再分配的代碼的步驟是在有限資源微電路中執(zhí)行的。
3.按照前述權(quán)利要求之一的方法,其特征在于,將原始中間代碼在驗(yàn)證方法的執(zhí)行之前加載到有限資源的微電路中,并且存儲(chǔ)在微電路的存儲(chǔ)器中。
4.按照前述權(quán)利要求之一的方法,其特征在于,在修改中間代碼的步驟中,創(chuàng)建一個(gè)定義實(shí)際類型寄存器到單態(tài)的虛擬寄存器的再分配的再分配部分T。
5.按照前一權(quán)利要求的方法,其特征在于,再分配部分T包含一個(gè)再分配子表D和一個(gè)再分配表F,該再分配子表D含有對(duì)定義實(shí)際寄存器之一中的變量的類型的中間代碼的每個(gè)定義指令“def”的再分配,該再分配表F含有實(shí)際類型寄存器到單態(tài)的虛擬寄存器的再分配。
6.按照前一權(quán)利要求的方法,其特征在于,在驗(yàn)證再分配部分T的過(guò)程期間,驗(yàn)證該定義指令“def”的再分配子表D是否含有一個(gè)再分配值,如果它不含有任何再分配值,則中間代碼被拒絕。
7.按照前述權(quán)利要求之一的方法,其特征在于,在驗(yàn)證再分配表F的過(guò)程期間,對(duì)于中間代碼的使用變量的指令,驗(yàn)證當(dāng)前再分配表中的所使用的變量是否不是“ni1”,如果是“ni1”,則中間代碼被拒絕。
8.按照前述權(quán)利要求之一的方法,其特征在于,在一個(gè)到目標(biāo)指令的切換指令“brch”的上下文中驗(yàn)證再分配表的過(guò)程期間,驗(yàn)證當(dāng)前再分配表F’與對(duì)應(yīng)于目標(biāo)指令的再分配表F的各行的一致,如果不同,則中間代碼被拒絕。
9.按照權(quán)利要求1至3之一的方法,其特征在于,修改中間代碼的步驟是在有限資源的微電路中執(zhí)行的。
全文摘要
本發(fā)明涉及一種驗(yàn)證能被與外部數(shù)據(jù)處理系統(tǒng)相連接的有限資源的微電路執(zhí)行的中間代碼的方法。該方法包含涉及修改中間代碼的步驟,其中包含把r類型的寄存器再分配到單態(tài)類型的虛擬v寄存器,以及構(gòu)造一個(gè)具有訪問(wèn)虛擬v寄存器的PC指令的再分配的代碼。此外,所述方法還包含在資源有限的微電路中驗(yàn)證該再分配的代碼的步驟。本發(fā)明的特征在于,在微電路中對(duì)再分配的代碼的成功驗(yàn)證之后,在有限資源的微電路中安裝原始中間代碼以供執(zhí)行。
文檔編號(hào)G06F9/445GK1672130SQ03817969
公開日2005年9月21日 申請(qǐng)日期2003年5月23日 優(yōu)先權(quán)日2002年5月27日
發(fā)明者J·-F·格雷茲斯, A·伯努瓦 申請(qǐng)人:格姆普拉斯公司