專利名稱:用于優(yōu)化的代碼檢查器的方法和設備的制作方法
技術領域:
本發(fā)明涉及對加載到電子設備例如-但不限于-存儲器資源有限的設備中的程序代碼進行檢查,所述存儲器資源有限的設備諸如是芯片卡或類似的設備。更準確的說,本發(fā)明的目的是對依照目前的高級語言編程技術、根據按照親緣關系所鏈接的類型加以組織的程序進行檢查,并且本發(fā)明以使用類型一致化過程的檢查技術為基礎,所述類型一致化過程目的在于確定這些類型共同的祖先。
這一目的是為了確保所加載的程序與集成該程序的設備所期望的特異性相一致。為此,要使用一種檢查器,該檢查器的任務典型地用于防止-使用顯式值來產生和修改指針-攻擊棧(“上溢”或“下溢”)確保-每條指令都有作為輸入的、正確數量的參數,并且這些輸入參數的類型都是正確的;以及-每個對象都已經被初始化過一次,且只被初始化過一次這樣就可以在集成程序之前過濾所加載的程序,特別是可以拒絕那些會有意地通過一個惡意的動作或者通過編制一個錯誤或者硬件故障的程序來破壞設備的正確運行的程序。
程序檢查的全部問題會出現在存儲器資源有限的設備的上下文環(huán)境中,在這一情形下,所述存儲器資源有限的設備是帶有所謂的開放式體系結構的芯片卡。這種類型的卡就由可能隨時加載和修改高級語言所編制的程序。開放式智能卡因此構成了能夠自包含式和通信的虛擬機,所述虛擬機能夠根據它的持有者所需要的新應用演進。
圖1說明了在這種上下文環(huán)境中的檢查活動。芯片卡2能夠加載一個或多個程序4,在這一情形下,所述程序是“JAVA小程序”類型的程序。
一旦程序4被加載到所述卡中,就必須繼續(xù)進行集成階段以使該程序可以被操作。檢查就發(fā)生在這個階段,并且用于確定所述卡是必須集成該程序還是相反擊拒絕它。這個任務是以對字節(jié)碼或偽代碼所進行的分析為基礎而執(zhí)行的,字節(jié)碼在下文中將用一個專用術語“byte code”加以指定。它是由字節(jié)碼檢查器6實施的,字節(jié)碼檢查器6構成了處于字節(jié)碼解釋器8上游的、虛擬機的一個功能元件。
在運轉中,檢查器6確定所加載的程序4的結構在功能上是完整的以及與卡2所期望的功能相兼容。如果檢查器確認該程序有效,就把它傳輸到字節(jié)碼解釋器8以便執(zhí)行它。相反,如果檢測到一個可能危及該卡的故障,則檢查器6會要求用于拒絕所加載的程序4的過程(由圖所表示的符號10)。
一般情況下,這種檢查過程的實現實際上對在其中正在執(zhí)行檢查的設備的存儲器資源造成了的壓力。特別是,檢查的迭代性質要求對結果數據進行多次更新,以及因此對在存儲單元中所進行邏輯狀態(tài)轉換更新多次。此外,所述檢查過程專用的存儲器空間對存儲器資源有限的設備來說也是值得考慮的。
這是因為卡的形式在它的硬件資源方面施加了很顯著的限制。該有限的空間被劃分成了6個功能部件,如圖2示意性地指示的,它們構成了卡2的微模塊12,即-微處理器14-安全單元16-固定存儲器18,在(英語術語稱謂中的ROM類型(只讀存儲器)的)只讀模式下可被訪問;-(英語術語稱謂中的RAM類型(隨機訪問存儲器),或者可能是FlashRAM)的易失性工作存儲器20。
-持久性存儲器22,或者非易失性存儲器,不過它允許寫和擦除周期。這個存儲器通常是以所謂的電可擦除可重寫ROM存儲器技術產生的,英文術語稱為EEPROM(電可擦除可編程只讀存儲器);和-輸入/輸出接口24,該整體由內部數據總線26相連接。
由于技術原因,給卡2的微模塊12裝備持久性存儲器容量22要比易失性存儲器20更好。但是,持久性存儲器與易失性存儲器相比具有很慢的寫時間(其比例約為從1000到10,000),這對“卡”程序員是很不利的。
更有甚者,持久性存儲器22產生涉及到一個可靠性問題,涉及到它的使用期限。這是因為根據所用的技術,在寫期間它們的存儲單元狀態(tài)的邏輯轉換會導致耗損,而該耗損主要取決于轉換方向;隨后會提及“壓力”轉換或操作。在持久性存儲器中每次壓力地寫值時,所使用的存儲單元出錯的概率都會增加。在這一情況下,隨后可以被讀出的值將與曾被寫入的值不一致。例如,制造商對使用EEPROM技術的持久性存儲器保證有限次數(104到106之間)的寫操作。
對存儲器來說,EEPROM類型的持久性存儲器有可用的四種操作-讀,為了讀取先前存儲的值;-擦除,包括實現從0到1的邏輯狀態(tài)轉換,存儲單元缺省地處于狀態(tài)1;-寫,包括實現從1到0的邏輯狀態(tài)轉換;-更新,包括實現之后是寫的擦除;擦除操作屬于壓力類型,并可能引起相關聯的存儲單元出錯。芯片卡2和芯片卡與之通信的終端之間的通信模塊是標準的??蓪⒖醋鳛槭芙K端控制的服務器。在沒有任何沖突的情況下發(fā)生運行。通信屬于“半雙工”類型(在同一時刻只允許在一個方向上通信)??ㄖ辉诮K端已經向其提出問題之后,才向其發(fā)送回應。
當前的趨勢是在越來越多的無所不在的數據處理方面集成卡。為此,已經開發(fā)出了所謂的開放式操作系統,例如″JavaCard″、″Multos″、″用于智能卡的Windows″和″Camille″。
這些操作系統使用戶能夠加載應用程序,并因此在每種情況下增強可以由卡形成的用途。另外,它們還使在卡中嵌入的應用程序能夠相互通信。
關于“JavaCard″系統,它以一種四層的體系結構為基礎,如圖3所示。最高層包含用戶應用,稱為“板載”28,它們以卡2專用的Java庫30為基礎。這些庫是Java API(來自英語″ApplicationProgram Interface″,即應用程序編程接口)的一個子集,并構成了“JavaCard″系統的第二層。應用程序的代碼以字節(jié)碼表示,字節(jié)碼由虛擬機32解釋。虛擬機32運行應用程序并且是以基本操作系統為基礎的,所述基本操作系統管理在存儲器的寫、基本輸入/輸出、對確保安全的加密程序的調用、以及最后對不同ISO標準的支持。最低的兩層32和34被存儲在芯片卡2的固定存儲器ROM18中。
每種方法都具有它自己的可利用的執(zhí)行棧,該執(zhí)行棧包含它操縱的變量和參數。虛擬機使用寄存器來存儲所謂的局部變量(在方法期間所分配的變量及其參數)。
虛擬機32中的安全性是一個重要問題,這是因為該虛擬機是對執(zhí)行移動代碼的支持,而該移動代碼可以來自各種不確定的源。因而可能使虛擬機32執(zhí)行危害系統或其它部件的可靠性的代碼。
考慮到這些困難,當前技術的目的是確保存儲器資源有限的設備自己本身不必對它要集成的程序執(zhí)行檢查,這個任務在上游被執(zhí)行或者被省略,依賴于確保程序完整性的認可證。
更特別地說,所提出的技術方案所依據的基礎是-防御性的虛擬機的使用;-在確認代碼無害的密碼系統的幫助下外部認證實體的使用-“字節(jié)碼”檢查算法的使用防御性虛擬機據說是“多疑的”。在執(zhí)行期間,它檢查每個字節(jié)碼元素不被判斷不當地使用(例如,它檢查每個字節(jié)碼在執(zhí)行棧上有正確個數的參數,或者還檢查每個方法調用是有效的)。這一技術方案的缺點是大幅降低了虛擬機的性能。
使用外部認證實體的技術方案具有很少修改虛擬機的優(yōu)點;但是,這種技術方案對于部署并大幅削弱虛擬機的開放式外部特性來說是非常昂貴的。
Java規(guī)范根據在加載字節(jié)碼期間對其的分析來定義了一種安全模型。這一分析的目的是證明所加載的程序無害;在相反情況的下,所加載的程序被拒絕。芯片卡具有的可用容量,被視為太小以致不能執(zhí)行這樣的分析。這就是為什么有多種技術方案被提出來的原因。
根據另一種已知的方法,執(zhí)行外部預處理能夠獲得額外信息的代碼或證據,使得卡能夠在加載期間檢查代碼。其它方法的目的是在存儲器有限的設備的資源中集成字節(jié)碼檢查器。
因此,在專利文獻WOA0114958中就曾提出了執(zhí)行對程序代碼的“卡外”修改,這樣后者就保持了它的原始意義但變得更易于檢查。這樣就通過允許在單一階段中進行檢查而簡化了檢查過程。但是,這樣做的缺點是需要對程序代碼進行修改并排除了對特定優(yōu)化技術的使用。
根據另一種特別用于KVM(來自專用術語K-虛擬機)虛擬機的方法,檢查包括執(zhí)行預計算并把它的結果加到代碼上。隨后由字節(jié)碼檢查器利用所加的預計算來允許使用更簡單的算法。也就是稱之為檢查載體代碼(術語還稱之為“PCC”,由英文“Proof CarryingCode”而來,即證據攜帶代碼)技術的簡化版本。
在Java語言中,規(guī)定了字節(jié)碼,這樣它能夠靜態(tài)地檢查程序操作的完整性。檢查被分為兩部分-結構性檢查;和-類型檢查(類型推理)類型推理可以被看作是數據流的分析,數據是由虛擬機的指令操縱的存儲單元,以字節(jié)碼表示。它的目的是通過拒絕可能危害它們的完整性的任何代碼而保護虛擬機以及基本系統,但也保護用戶應用程序。類型推理的主要任務是確保組成程序的每條指令操縱數據(存儲器)并在考慮其它處理的規(guī)范時觸發(fā)對它們的執(zhí)行。
類型推理是分析靜態(tài)代碼的過程,該過程發(fā)生在加載應用程序期間。就執(zhí)行時間和存儲器消耗來說它被認為是一種昂貴的算法。這可能大大加重將代碼加載到虛擬機32中的處理器的負擔。因而當硬件約束被認為過大時(例如在一個芯片卡中),類型推理通常由外部第三方執(zhí)行。
對于這個方面的更多信息,可以參考下列出版物Rose E.和Rose K.H.″Lightweight bytecode verification″;Workshop on FormalUnderpinnings of the Java Paradigm,OOPSLA′98,1998;Necula G.C.和Lee P,″Proof Carrying Code″Proceedings of the24thACMSIGPLAN-SIGACTSymposium on Principles ofProgramming Languages(POPL′97),Paris,January 1997.在ColbyC.,Necula G.C.,和Lee P.的文章中,″A proof carrying codearchitecture for Java ″Computer Aided Verification,2000,和NeculaG.C.″A scalable architecture for proof carrying code″,FifthInternational Symposium of 2001,PCC的發(fā)明者描述了如何將這項技術用于Java字節(jié)碼檢查和板載檢查。
已知的解決方法提供了相同級別的安全性,并顯著地簡化了板載檢查器的工作。但是,它們與完全嵌入式的技術方案相比都有些不夠靈活,因為任何不帶證書的應用程序都將被拒絕,即使它是有效的。PCC技術方案的主要缺點是證據必須被加載并存儲在卡中。要加載的部件的附加無助于減少應用程序加載器構成的瓶頸。另外,由于大小的原因,證據必須被存儲在持久性存儲器(EPPROM)22中,并因此而遭受速度和可靠性方面的問題。
由類型推理提供的保證在性質上是多的并且是可變的。最重要的利害關系是虛擬機32的安全性。要尋求保證它的相干性和一致性。
按照上面的論述,本發(fā)明根據第一個方面提出一種用于在把程序集成到電子設備中的階段期間對程序進行檢查的方法,所述程序根據按照親緣關系鏈接的類型加以組織,每種類型都由各自的代碼加以標識,該方法包括對這些類型進行一致化的階段,目的在于確定這些類型最靠近的共同祖先。
特征在于所述代碼是根據如下形式體系(formalism)并以位模式的形式加以描述的,所述形式體系表示與所述代碼相關聯的類型的親緣;并且特征還在于所述一致化階段包括對分配給要一致化的類型的模式進行邏輯組合,產生作為這些類型最靠近的共同祖先的類型的模式。
有利地的是,對具有祖先的任何類型來說,它的模式包含至少一個位,所述位在值和位置上與它的直接祖先的模式的對應位相同。
一個給定位的模式優(yōu)選地包括多個處于預定邏輯狀態(tài)的位,所述預定的邏輯狀態(tài)是所述共同祖先的類型的距離的函數。
在優(yōu)選實施例中,使用通過損耗性邏輯狀態(tài)轉換而經受損耗的存儲器,以便存儲預定要在所述一致化階段中經受邏輯組合的至少一個模式,或存儲在所述一致化階段中由邏輯組合所產生的至少一個模式。
這樣就能夠設想一種模式分配形式體系,該形式體系在所有模式中建立了邏輯狀態(tài)的優(yōu)勢,該優(yōu)勢使在存儲器中實現模式的存儲所需的損耗性轉換的次數最小化。
優(yōu)選地,存儲器的存儲單元被初始化為一種邏輯狀態(tài),從這個狀態(tài)開始,轉換處于與損耗性轉換的方向相反的方向上。
當損耗性轉換處于從邏輯0狀態(tài)到邏輯1狀態(tài)的方向上時,邏輯組合優(yōu)選地包括在相同等級組合模式的每一對位之間執(zhí)行與(AND)類型的邏輯操作。
當損耗性轉換處于從邏輯1狀態(tài)到邏輯0狀態(tài)的方向上時,邏輯組合優(yōu)選地包括在相同等級組合模式的每一對位之間執(zhí)行或(OR)類型的邏輯操作。
此外,所述方法可以為處于一組代碼段形式的程序家加以實現,每個代碼段由一個標記加以標識,所述標記對應于可以從一個分支到達的指令,按照給定的試探法以給定的段順序按段進行檢查來繼續(xù)進行。
在這一情況下,要檢查的段的順序可以是被檢查段的連續(xù)順序,在被檢查的段之后跟隨著作為它的后續(xù)者的段。
要檢查的段的順序也可以由第一加標記的段給出。
有利的是,使用易失性存儲器作為緩存器,用于在邏輯組合步驟中存儲候選模式,并且根據要檢查的程序中的分支點動態(tài)且預測地選擇候選模式。
然后,可以選擇如下模式,以便存儲到易失性存儲器中,所述模式對應于那些在給定時間后可能要經受一致化的類型,并且通過參考要檢查的程序的控制流程圖,對要存儲的模式作出選擇。
相反地,可以選擇如下模式,以便卸載所述易失性存儲器,所述模式對應于那些在給定時間后更可能要經受一致化的類型,并且通過參考要檢查的程序的控制流程圖,對要從存儲器除去的模式作出選擇。
控制流程圖優(yōu)選地是根據先前確定的標記和分支到這些標記的指令而建立的。在所設想的實施例中,檢查方法是用于如下設備的執(zhí)行介質執(zhí)行的,所述設備用于執(zhí)行要經受檢查的程序的代碼。本發(fā)明尤其有利于在芯片卡類型的電子設備中執(zhí)行檢查。
依照第二方面,本發(fā)明涉及一種在把程序集成到電子設備中的階段期間對程序進行檢查的電子設備,所述程序根據按照親緣關系所鏈接的類型而加以組織,每種類型由各自的代碼加以標識,所述設備包括一致化類型裝置,用于對這些類型進行一致化以便確定這些類型最靠近的共同祖先,特征在于它包括用于標識類型的親緣的裝置,對類型的標識是以位模式為基礎進行的,所述位模式根據給定的形式體系構成了它的代碼;特征還在于所述一致化裝置包括對分配給要一致化的類型的模式進行邏輯組合并產生作為它們最靠近的共同祖先類型的模式的裝置。
可以生產這種檢查設備以便能夠執(zhí)行依照第一個方面的方法。
依照第三個方面,本發(fā)明涉及用于加載并執(zhí)行按照由親緣關系所鏈接的類型所組織的程序,每種類型由各自的代碼加以標識,特征在于它集成符合第二個方面檢查設備。
在所設想的實施例中,這種設備是以芯片卡的形式生產的。
通過參考附圖來閱讀隨后的、對優(yōu)選實施例的說明,將會更了解本發(fā)明及其優(yōu)勢,優(yōu)選實施例是以非限性實例給出的,在附圖中-圖1,已描述過,是說明在像芯片卡這樣的移動設備中集成代碼檢查器的原理的圖;-圖2,已描述過,是構成開放式體系結構芯片卡的微模塊的功能元件的框圖;-圖3,已描述過,是說明構成虛擬機的各個層的圖;-圖4是以表格形式給出的、在結合假設的更改之后典型的和創(chuàng)新的推理跟蹤的實例;-圖5說明依照優(yōu)選實施例的、非壓力的-致化網格編碼的實例;-圖6是說明為了通過軟件緩存器而加速檢查而使用控制流程圖的實例;在描繪本發(fā)明的實施例之前,將給出通過所謂“引用”算法在虛擬機32中進行字節(jié)碼檢查的原理,在專利文獻USA5 668999中描述了這種原理。
為了便于對引用算法-術語也稱為“類型推理算法”的理解,將通過應用于Java語言的實例來對其進行描述。
如前所述,Java虛擬機是棧式機。它對稱為局部變量的工作變量以及對棧執(zhí)行操作。這個方法的目的是為程序中的每個點確定每個局部變量以及棧中每個單元的類型。為此,利用了Java字節(jié)碼被給出類型的優(yōu)勢。
在下文中,術語“執(zhí)行上下文”被賦予局部變量/棧對。它包括類型信息。
類型推理以對代碼的靜態(tài)分析為基礎。Java字節(jié)碼的每條指令都可以被模型化成采用它在棧上或在局部變量中的參數,并在必要時在棧頂或局部變量中產生結果。對在方法期間分配的JaVa對象和變量來說,它們的類型是通過用于它的創(chuàng)建的字節(jié)碼而確定的。
在將要通過以下實例說明的類之間存在順序關系。
有兩個類″Parent″和″Child″,其中″Child″是由如下代碼鏈接的″Parent″的子類,Child class extends Parent{public static Parent m(){return new Child();}方法″Child m()″聲明返回一個類型Class″Parent″,或者返回類型元素″Child″。問題在檢查期間被提出″Chilld″與″Parent″兼容嗎?回答是肯定的,因為″Child″是″Parent″的子類。這個例子說明需要有一個操作來確定一種類型是否與另一種類型兼容。
更簡單地,使用順序關系來構建一個函數,該函數使得聲明是否可以用一種類型而不使用另一種類型成為可能。
關于T的順序關系的行為指定為“T”的類型是網格(trellis)的根;它僅與它自己相兼容。它是網格中最大的元素。T類型的變量是不可用的變量。
與″null″相關的關系順序的行為類型″null″是形成包含Java類的網格的元素。它是這個部分的最小元素。因此,它與所有Java類相兼容。
合一符和固定點圖4中給出了一個實例的類型推理跟蹤,該實例說明了類型推理算法的另一特殊性。對程序中的兩條路徑來說,在棧頂的變量類型上建立不同的假定。第一種技術方案是把其標記為類型T,因而不可用。這樣的限制過大方法″must()″是在其Java代碼有效的″Parent″類中定義的方法。這是因為″Child1″和″Child2″都繼承了這個方法。
在從塊″if-else″的輸出上,必須按關系在棧頂變量上放置兩個假定。不可能靜態(tài)地確定這兩個中的哪個是正確的。從注釋Parent是″Child1″和″Child2″的母類開始,可以聲明,在從塊″if-else″的輸出上,棧頂包含對″Parent″類型元素的引用,與通過我們的程序中每條路徑上的類型推理所獲得的類型相兼容的僅有假定。
這樣就實現了對假定的一種連接。這種連接被稱為“一致化”。用這種方式定義了一種新關系,包括為兩種類型找到“共同親代”。因為網格向上是有界的,所以可以定義并使用它。它被稱為“合一符”并由符號“∩”指示。
在涉及網格的數學理論中,這個操作包括確定兩個結點的共同親代。這個結點被稱為LUB(來自英文術語“l(fā)east-upper-bound”,最小上界)。這個操作的復雜度隨網格的深度增加而增加。因而,在存儲器有限的設備-例如芯片卡環(huán)境中把它放到合適的位置并非不重要。
另外還必須對一段代碼重復類型推理過程。這是因為,如果在一代碼段的入口點上引入假定,就必須用新的假定量做。迭代的次數必定是有限的,因為每次一致化有助于把變量類型向T退回,在最壞情況下將退回到T。這是因為所用的變換是單調函數。
下面的Java程序說明了對固定點的查找public static void m(boolean b){Object o=null;while(b){o= new Object;}
}在第一段,局部變量v1是″null″類型。第一個類型推理是在與″while″對應的代碼段上執(zhí)行的。在這段代碼中,在局部變量v1中存儲了一個″Objeet″。接下來,轉到″while″的開始,因此在兩個假定之間實現一致化。局部變量v1在第一段曾是″null″類型,現在是″refObject″類型,因為″null″與所有Java類都相兼容。必須重做與″while″對應的代碼段,以查看新的假定是否與這個代碼段相兼容。在這個例子中,如果是,就接受該程序。
上述被稱為對固定點的查找,因為當實現平衡時,類型推理過程是被連續(xù)迭代的,或者更準確地說一致化不再更改類型信息。
引用算法這一段中的算法被以它最常見的形式進行描述,這種形式不會完全對應于后續(xù)所使用的算法,因為它沒有任何形式的優(yōu)化。
對所用的每條指令來說,使用一種表來包含每個局部變量的類型,棧中元素的類型以及棧索引的值,稱為TOS(來自英文“top ofstack”,即棧頂)。(在英文術語中,這張表被稱為“類型框架(typeframe)”)。另外,對每條指令還有一個可用的標志;它說明對應指令的類型指令已經或還沒有被上一次實現過的一致化之一修改過。這個標志可以有兩個值″changed″(修改過)或″unchanged″(未修改過)。
引用算法包括兩個連續(xù)的階段,分別命名為″初始化″和″主循環(huán)″,它們的主要步驟總結如下初始化-初始化每條程序指令的信息。除將被定位在″changed″狀態(tài)的第一條指令外,把所有指令都定位在″unchanged″狀態(tài);-在簽名里所用的其類型信息中填充,沒有類型的變量被初始化為T,用值0初始化它的TOS;-針對其它指令I;-設置I的標志為值″unchanged″;-初始化TOS為-1(這用于標記這條指令還沒有被訪問過)主循環(huán)-只要還有標志在值為″changed″的指令;
-選擇一條被標記為″changed″的指令,這條指令用I指示;-標記I為″unchanged″;-在與I相關的類型信息上模擬它的執(zhí)行。如果模擬失敗,該方法就被拒絕?!孱愋涂蚣堋逵蒖表示;-針對I的每個后續(xù)者S;-表示I的″類型框架″為O,表示S的″類型框架″為R;-如果與S相關的TOS等于-1,則R=0(并且I的TOS也被復制到S的TOS中);一如果否,就對R和O實行一致化。結果由R∩O指示(如果兩個″類型幀″的TOS不同,檢查失敗);-如果R∩O≠R,標記S為″changed″,R∩O變成S的新″類型框架″。
只要還有被標記為″changed″的指令,就重復主循環(huán)。當到達穩(wěn)定的位置時就停止,因此使用術語固定點。對執(zhí)行的模擬(如前所述)包括存在于驗證棧上的參數(它們有足夠的數量并且它們的類型是所期望的類型),并根據所執(zhí)行的字節(jié)碼更新″類型框架″。這樣就驗證了有沒有棧發(fā)生上溢或下溢,并且類型也是正確的。
現在將處理為在芯片卡的上下文環(huán)境中掉換這些驗證概念要考慮的方面。
主要問題在于卡中固有的處理和存儲資源的限制,如上所述。
另外,從字節(jié)碼來看,必須找到所操縱的每個字段的類型。這個操作是有技巧的。此外,在類型推理期間,它要被執(zhí)行多次,因而它需要多次通過變量結構大小的轉換。一種技術方案是構造有效的內部表示。
JavaCard字節(jié)碼中固有的類型JavaCard語言需要合適的類型,這涉及對上述算法的更改和調整,特別是關于類型和子例程網格的更改和調整。
類型的網格圖5中描繪了JavaCard類型網格的一個實例。
在上面的實例中,已經發(fā)現類型推理需要對一致化函數進行多次調用。
實現它的最標準的方式包括構造有序的結構以便來代表網格。在微處理器上下文環(huán)境中并不能容易地設想到這種技術方案,因為它會需要大量的存儲器。在高度受約束的環(huán)境中實現的最標準的方式包括根據要一致化的兩種類型級聯地使用一系列測試。這種技術方案不是最優(yōu)的。
下面將在被加載到設備-尤其是芯片卡2中的程序的上下文環(huán)境下描述這些實施例中所采用的技術方案,這可以通過依照本發(fā)明的技術和優(yōu)化來實現完全的類型推理。
首先描述一致化的加速機制,然后根據軟件緩存器的使用來優(yōu)化固定點的管理。
一致化的有效管理該實施例通過兩種方案解決來處理由推理的復雜性所提出的問題一致化表和可選的、用于易受特定方向的轉換而耗損的存儲器的非壓力一致化編碼。
-一致化表實施例所用的第一技術方案包括預先計算類型一致化規(guī)則。隨后得到帶有兩個輸入的表(要一致化的兩個類型t1和t2),該表提供對問題t1∩t2等于什么的回答。隨后提出涉及可用類型的無窮盡的問題事實上,可以在芯片卡中加載大量的類。新類的加入隨即將導致在一致化表中創(chuàng)建新行或新列,以及導致使用卡中此時已經存在的所有類型對其一致化結果進行計算。
下面的表1中給出了一致化加速表的一部分的例子。(符號″T″(代表“頂部”)指示所有類型的共同親代,即網格的頂部)·表1一致化表的一部分的實例
TopintObjectarraybyteshortint nullTop TopTopTop Top Top Top Top Topint TopintTop Top Top Top Top TopObject TopTopObjectObject Object Object Object ObjectboolTopTopObjectbool Object Object Object boolbyteTopTopObjectObject byteObject Object byteshort TopTopObjectObject Object shortObject shortint TopTopObjectObject Object Object int intnullTopTopObjectbool byteshortint null為進行一致化使用該表容易去設立。另外,該表被計算一次而且僅計算一次,因而它可被存儲在卡2的ROM存儲器18中。
通過這種方法,在大多數情況下,一致化被減小到讀取一張有兩個輸入的表。
有效和非壓力地一致化編碼在推理期間所操縱的信息是類型。對于每種類型,根據表示它的親緣的形式體系而建立它的編碼。這個編碼被用來獲得更有效的一致化。
為此,使用一種技術來實現對網格的操作到布爾操作的雙射。所用的編碼使得能夠通過對邏輯函數的組合找到網格的兩個元素的共同親代。構成一致化的結果隨后提交代碼,所述代碼根據所建立的形式體系而與兩個類型的共同親代相對應。
實際上,在大多數情況下,由于類型信息的大小,所以其必須存儲在持久性存儲器22中,特別是存儲在EEPROM類型的持久性存儲器中。但是,這種類型的存儲器易受到壓力。更準確地說,這種存儲器容易受損于由邏輯狀態(tài)在特定方向轉換的累積而導致的損耗,所述特定方向在這一情況下是從0到1。相反,在EEPROM中位從1跌落到0的操作是非-壓力的(它不會損害對應的存儲單元)。
從在一致化階段期間網格中的類型被退回到類型T的事實開始,所采用的形式體系的目的是確保這種操作只產生EEPROM的位從1到0的轉換。
圖5中所描繪的實例說明了這種方法。
圖5描繪了非-壓力一致化網格的一個例子。位于網格頂部的所有類型的共同親代被指定為頂(即英文中的″top″)。
該實施例中所用的形式體系適用于盡可能地避免在卡2的EEPROM存儲器22中進行壓力轉換,所述形式體系為這種共同親代固定作為代碼的模式,該模式由處在0狀態(tài)的位所形成。形成這個模式的位數是根據網格中共享相同的共同祖先的類型的最大數而選擇的。每種類型都用包括相同位數的模式來編碼。在該實例中,6位構成一個模式,共同親代T具有″000000″的模式。特別的是要確保這個位數要使下列情況成為可能-首先,為網格中的每種類型分配一個單一的模式;-第二,在處于1狀態(tài)的位數的基礎上表示從網格頂部T到對應類型的距離,即它在網格中的深度(按照連接這個類型到共同親代的祖先的個數)。在該實例中,這個距離是直接由處于1狀態(tài)的位數指示的,除了構成網格底部的″Null″類型以外,為它分配一個單獨的模式,在這一情況下,在這個實例中是″011111″。
應該注意,對于給定的類型(除共同親代T之外),它的模式包括至少一個位,該至少一個位在值和位置上與它的直接祖先的模式都相同。
對于具有不是共同親代的直接祖先的給定類型來說,這個親代的每個處于1狀態(tài)的位都處于這個給定類型的模式中的相同位置。(后者還包括一個附加的處于1狀態(tài)的位,這個位是它所特有的并且能夠區(qū)分這個直接共同祖先的其它直接后代)。
因而,當存在具有一個共同祖先的幾種類型時,在兩個模式的模式之間的單一邏輯與(AND)操作就能夠重新產生直接共同祖先的模式。模式之間的與操作包括執(zhí)行模式的、在相同位置上的每個位之間的與操作。這樣,通過對它們的模式執(zhí)行與操作就實現類型的一致化。
為了說明起見,在圖5中確保將分配給類型″bool″和″short″模式的組合相與-即(010001)與(010100)0與0=0,1與1=1,...1與0=0),產生對應于它們的共同親代″Object″的模式010000。
這種編碼最重要的屬性是它特別適合在EEPROM中存儲特別是能夠在EEPROM中存儲類型信息,因為前者與芯片卡的其它可用存儲器相比可以較大。當位下落(從1到0變遷)時,對EEPROM的壓力是有限的。一致化被簡化到邏輯與,把它施加到兩個類型上,位只會從1變到0,而不會從0變到1。因而顯著地減少了壓力并延長了EEPROM的使用期限。
這種類型的編碼可以適用于任意類型的EEPROM。這是因為一些類型對于寫模式下的壓力有相反的特性,即壓力轉換通過從1到0的變遷導致。在這種情況下,編碼被改變,以把一致化簡化到邏輯或。
更準確地說,模式的邏輯狀態(tài)和為上述與組合所使用那些對稱地相反。為了恢復如5的實例,接著就給共同親代T分配″111111″,為類型″Int″分配″011111″等等。根據簡單的布爾邏輯原理能夠很容易地驗證在這種情況下使用邏輯或操作來代替圖5的環(huán)境中的邏輯與操作可以獲得相同的結果。
在需要的地方,通過可能引起壓力轉換的、在EEPROM中進行的存儲,并通過使用更復雜的布爾函數可以使編碼更緊湊。
固定點的有效管理您將回憶起類型推理是對固定點的搜索。前面所描述的類型編碼對減少EEPROM上的壓力略微有些貢獻。該實施例還能夠-加速一致化;-優(yōu)化對RAM存儲器20的使用,并-對下列兩種情況有通用的算法驗證可以在RAM中進行,或者要由EEPROM的資源時。這些優(yōu)勢首先通過使用試探法來選擇要驗證的標記(術語也稱為″label(標簽)″)、其次通過組合這個選擇和軟件緩存器的控制而獲得,所述緩存器即RAM存儲器的一部分用作緩存器以對在不久的將來可能要處理的數據進行快速訪問。目的于是包括在所述緩存器中加載類型的模式,針對所述類型的模式設想了為短期的一致化。這些模式,稱為″候選″模式,由稱為″試探法″的通用規(guī)則所定義的預測技術加以選擇。軟件緩存器的存儲容量是受到限制的,試探法必須不僅能夠預測很快就要被組合的模式,相反地好要預測那些更可能被組合的模式以消除它們。這需要動態(tài)改變的管理。此外,試探法被有利地使用,試探發(fā)只需要少量的計算而不會加重所用資源的負擔。
用于選擇要被檢查的標記的試探法上述優(yōu)化的類型推理算法工作在JavaCard程序的分支點上。在推理期間,可以有多個標簽被標記為將要加以檢查。這因此導致了選擇它們中的一個并檢查對應的代碼段。因此,必須有一個選擇標準。為了測量并比較可能的試探法,被標示為r的比率按如下加以定義r=一致化的數量/標記的數量;它使得能夠測量每個代碼段到達固定點所必需的變遷個數。
-″Random″試探法(隨機)這個試探法可以用作參考。它能夠在評估集上獲得好的結果。這包括在標記的類型之間隨機地選擇要檢查的下一個標記。
-″Next″試探法(下一個)″Next″試探法相對簡單。它包括選擇這樣的標記,該標記作為剛剛已經被檢查過的標記的后續(xù)者。這樣,就得到了線性檢查遍歷的必需數量。
-″Lazy(懶惰)″試探法(搜索簡易性)″懶惰″試探法按照功效和簡易性是最佳的。它包括先取一個要檢查的標記首先加上標記。通常,JavaCard程序產生于通過Java開發(fā)包(英語術語JDK,代表″Java Development Kit″)所編譯的Java代碼的轉換。但是,這產生了相當線性的代碼。因而程序的停止點通常能在字節(jié)碼結束時清楚地找到。因此,通過系統地用作為要檢查的第一個標記,這一發(fā)現就被拓展了。這樣,就計算出了程序的開始以便在后面就不再返回到這里?!鍛卸琛逶囂椒樯厦娑x的比率r能夠獲得值1.3。
更細的試探法可以被加以施用,尤其是使用所檢查的程序的檢查流程圖。該圖尤其可用于控制軟件緩存器。
最佳緩存器明智地使用軟件緩存器還能夠獲得加速度因子,在檢查相對較大型的程序(例如小應用程序)期間尤其如此,因為它們略微減少了在EEPROM中進行寫的次數。它們還通過在EEPROM中進行任何寫來顯著地加速對小程序的檢查。
為了進行類型推理,必須檢查程序的消失點。在這樣做的過程中,構建程序的檢查流程圖是容易和“自由”的。某些方法要求4KB以上的存儲空間以便對其進行檢查,現有技術中的高級芯片卡已經有可用的8KB的RAM。因而,可以設想使用這類方法來檢查應用程序。
在所述實現中,在EEPROM和RAM之間建立軟件緩存器,以便最好地操縱類型框架。這涉及到在檢查期間從緩存器中選擇要刪除(消除)的數據的階段,并因此而涉及到緩存器管理策略。
為此,可以使用常規(guī)策略-例如LRU類型,所述LRU類型適用消除最靠近最小使用的數據,英文是″Lease Recently Used″)。
但是,可以有利地拓展如下事實因為可以使用檢查流程圖,所以就易于確定在緩存器中存在的、哪些是相關的數據以及哪些是因此而必須被保留的數據。知道了為要檢查的標記所選擇的試探法的類型,就能夠很容易地根據給定的機制估計緩存器中數據的相干性。舉例來說,可以參考Chi-Keung Luk和Todd C.Mowry的文章″Compiler-based prefetching for recursive data structures″,ACMSIGPLAN Notices 31(9)222-333,1996中所描述的機制。
將通過下面的例子展示為確定緩存器管理機制而對檢查流程圖的使用。檢查流程圖是依照參考圖6而說明的實例提供的。
表II指示了針對這個例子的類型推理的可能的執(zhí)行跟蹤。
表II針對圖6的例子的類型推理的可能的執(zhí)行跟蹤1.把當前上下文和程序開始的當前上下文一起加載2.使用來標簽1一致化3.使用來標簽2一致化4.選擇標簽15.使用標簽2來一致化6.選擇標簽27.使用標簽3來一致化8.使用標簽2來一致化9.選擇標簽2
10.使用標簽3來一致化11.標簽2來一致化12.選擇標簽313.檢查結束采用這樣的假定″懶惰″試探法被使用來選擇下一個要檢查的標記(標簽),并且作出嘗試來在RAM20(即,在緩存器中)中實施一致化。對于最初為空并有兩個單元的緩存器的情況來說,圖6中給出的檢查跟蹤按如下產生-第一步是通過與程序開始42相關聯的類型信息來加載當前描述符;-檢查第一個代碼段,并到達意圖在于標記″標簽1″46的條件分支44。因此,有必要使用當前的類型框架來一致化標記″標簽1″的類型″框架″。因此,標記″標簽1″的類型信息將被加載到緩存器中;-然后,在遇到第二個分支48時必須用標記″標簽2″50來一致化48。因為具有可用的緩存器單元,所以可將標記″標簽2″的信息加載到其中;-根據對″懶惰″試探法的使用而選擇標記″標簽1″,以便檢查對應的代碼段;-必須用標記″標簽2″來進行一致化;但是,后者處在緩存器中。一致化因此就發(fā)生在RAM中;-選擇下一個標記,即″標簽2″;-到達條件跳轉52,在它的終點有標記″標簽3″54。在該緩存器中不存在任何對應的類型信息。后者是滿的(它包含用于標記″標簽1″和″標簽2″的類型信息)。因此,必須從這些標記中選擇一個標記,以便釋放緩存器中的一個單元并在其中加載用于標記″標簽3″的類型信息。參考檢查流程圖,可以看出只有標記″標簽2″和″標簽3″才可以從當前代碼段中訪問到(在該圖的更深一級可以看到從標記″標簽2″,也可以訪問到標記″標簽2″和″標簽3″;從標記″標簽3″,卻訪問不到任何標記)。因而,能夠為緩存器消除標記″標簽1″并在EEPROM中更新它的副本。
-檢查毫無障礙地繼續(xù)著,直到程序56結束為止。
如果不使用緩存器,則在這個例子中可能有必要在EEPROM中去執(zhí)行七次一致化(即,在EEPROM中進行七次寫)。如果使用緩存器,則在EEPROM中標記″標簽1″的的類型信息就被更新一次且僅被更新一次。另外,這一更新不是必須的,因為程序中的任何路徑在驗證中的這個時刻都不再能夠訪問到標記″標簽1″。它的類型信息因而也再是必需的。
這里給出了為了最好地控制緩存器而使用待檢查程序的檢查流程圖的各種可能性的說明。在這樣做的過程中,近似達到了最優(yōu)緩存器(即,在緩存器中在正確的時間有正確的信息)。
因為在討論中的這一例子中,構造檢查流程圖是廉價的,所以使用它就不僅可以控制軟件緩存器,還可以改善用于要檢查的標記的選擇試探法。
優(yōu)選的實施例能夠獲取簡單的檢查系統,這種簡單的檢查系統展開了使用檢查器的可能性,所述檢查器被完全加載到微處理器卡或其它存儲器有限的設備中。
對本領域的技術人員來說顯而易見的是本發(fā)明就邏輯、硬件和環(huán)境而言,根據它的使用條件和標準可以有多種變體和等價物。
權利要求
1.一種用于在把程序(4)集成到電子設備(2)中的階段期間對程序(4)進行檢查的方法,所述程序根據按照親緣關系所鏈接的類型而加以組織,每種類型由各自的代碼加以標識,所述方法包括對這些類型進行一致化的階段,目的在于確定這些類型最靠近的共同祖先,特征如下所述代碼是根據如下形式體系并采用位模式的形式加以描述的,所述形式體系表示與所述代碼相關聯的類型的親緣;并且所述一致化階段包括對分配給要一致化的類型的模式進行邏輯組合,產生作為這些類型最靠近的共同祖先的類型的模式。
2.如權利要求1所述的方法,其特征在于,對于具有祖先的任何類型,它的模式包含至少一個位,所述位在值和位置上都與它的直接祖先的模式的對應位完全相同。
3.如權利要求1或2所述的方法,其特征在于,一個給定類型的模式包含多個處于預定邏輯狀態(tài)的位,所述預定邏輯狀態(tài)取決于所述類型到共同祖先的距離。
4.如權利要求1到3所述的方法,其特征在于,使用通過損耗性邏輯狀態(tài)轉換而經受損耗的存儲器(22),以便存儲預定要在所述一致化階段中進行邏輯組合的至少一個模式,或存儲在所述一致化階段中由邏輯組合所產生的至少一個模式。
5.權利要求4所述的方法,其特征在于,模式分配形式體系在模式組中建立邏輯狀態(tài)的優(yōu)勢,所述優(yōu)勢使得在所述存儲器(22)中實現模式的存儲所需的損耗性轉換的次數最小化。
6.如權利要求4或5所述的方法,其特征在于,所述存儲器(22)的存儲單元被初始化為如下的邏輯狀態(tài),從所述邏輯狀態(tài)起,所述轉換處于與損耗性轉換的方向相反的方向上。
7.如權利要求4到6任一項所述的方法,共特征是,所述損耗性轉換處于從邏輯0狀態(tài)到邏輯1狀態(tài)的方向上,所述邏輯組合包括在相同等級組合模式的每一對位之間執(zhí)行與類型的邏輯操作。
8.如權利要求4到6任一項所述的方法,所述損耗性轉換處于從邏輯1狀態(tài)到邏輯0狀態(tài)的方向上,所述邏輯組合包括在相同等級組合模式的每一對位之間執(zhí)行或類型的邏輯操作。
9.如權利要求1到8任一項所述的方法,為處于一組代碼段形式的程序而加以實現,每個代碼段由一個標記加以標識,所述標記對應于可以從一個分支到達的指令,特征在于,所述檢查在預定的試探法中采用給定的段順序按段來實施。
10.權利要求9所述的方法,其特征在于,要檢查的段的順序是被檢查的段的連續(xù)順序,在被檢查的段的后面跟隨著作為它的后續(xù)者的段。
11.如權利要求9所述的方法,其特征在于,要檢查的段的順序由第一個加標記的段給出。
12.如權利要求1到11任一項所述的方法,其特征在于,使用易失性存儲器(20)作為緩存器,用于為邏輯組合步驟存儲候選模式,并且所述候選模式是根據在要檢查的程序(4)中的分支點是動態(tài)且預測地加以選取的。
13.如權利要求12所述的方法,其特征在于,選擇如下模式,以便存儲到易失性存儲器(20)中,所述模式對應于那些在給定時間后可能要經受一致化的類型,并且通過參考要檢查的程序(4)的檢查流程圖,對要存儲的模式作出選擇。
14.如權利要求12或13中所述的方法,其特征在于,選擇如下模式,以便清空所述易失性存儲器(20),所述模式對應于那些在給定時間后更可能要經受一致化的類型,并且通過參考要檢查的程序的檢查流程圖,對要清空的模式作出選擇。
15.如權利要求13或14所述的方法,其特征在于,所述檢查流程圖是根據所述先前確定的標記和分支到這些標記的指令而建立的。
16.如權利要求1到15任一項所述的方法,其特征在于,所述檢查是在芯片卡類型的電子設備(2)中實施的。
17.一種用于在把程序(4)集成到電子設備(2)中的階段期間對程序進行檢查的設備(6),所述程序根據按照親緣關系所鏈接的類型加以組織,每種類型由備自的代碼加以標識,所述檢查設備包括一致化裝置,用于對這些類型進行一致化以便確定這些類型最靠近的共同祖先,特征在于所述設備包括用于標識類型的親緣的裝置,對類型的標識是以位模式為基礎進行的,所述位模式根據給定的形式體系構成了它的代碼,并且所述一致化裝置包括對分配給要進行一致化的類型的模式進行邏輯組合并產生作為它們最靠近的共同祖先的類型的模式的裝置。
18.如權利要求17所述的設備,能夠執(zhí)行權利要求1到15任一項所述的方法。
19.一種用于加載并運行根據按照親緣關系鏈接的類型而組織的程序的電子設備(2),每種類型由各自的代碼加以標識,特征是所述設備集成符合權利要求17或18的檢查設備。
20.如權利要求19所述的設備,其特征在于,所述設備采用芯片卡的形式而加以生產。
全文摘要
當正在把程序(4)集成到電子設備(2)中時,對程序(4)施加驗證過程,所述程序是根據按照親緣關系所鏈接的類型而加以組織的,每種類型由各自的代碼加以標識。本發(fā)明的特征在于,它包括如下的一個階段,所述階段包括對這些類型實施一致化的階段以便確定這些類型最靠近的共同祖先所述代碼包括根據如下形式體系的位模式,所述形式體系表示與所述代碼相關聯的類型的親緣,所述確定是通過如下方式實施的使用所述代碼的形式;并且對分配給要一致化的類型的模式進行邏輯組合,產生作為這些類型最靠近的共同祖先的類型的模式。本發(fā)明能夠在帶有存儲器資源有限的設備中進行驗證,特別是在智能卡2中進行驗證。
文檔編號G06F11/36GK1589435SQ02823284
公開日2005年3月2日 申請日期2002年9月24日 優(yōu)先權日2001年9月24日
發(fā)明者G·格里莫, D·德維爾, A·雷克特 申請人:格姆普拉斯公司