可攜式數據載體中的存儲器管理的製作方法
2023-05-17 20:25:56 3
專利名稱:可攜式數據載體中的存儲器管理的製作方法
技術領域:
本發明一般涉及在由具有處理器的可攜式數據載體執行程序時的存儲器管理的技術領域。特別地,這種可攜式數據載體可以為各種構造形式的晶片卡、或晶片模塊。更具體地說,本發明涉及使用數據載體的兩個不同的存儲器區域,以便存儲在程序執行期間生成的對象。
背景技術:
在可攜式數據載體中,一般提供了以各種存儲器技術構造的多個存儲器區域。典型地,將存儲器細分為易失性讀/寫存儲器(RAM),非易失性可寫存儲器(EEPROM)、以及屏蔽編程(mask-programmed)固定值存儲器(ROM)。寫入到RAM(write-to-RAM)操作需要相當短的時間-例如,其是寫入到EEPROM(write-to-EEPROM)操作所需時間的1/30。另一方面,RAM中的一位比EEPROM中的一位在數據載體的半導體晶片上佔據大得多的區域,使得通常僅提供相對小的RAM。因而,存在以儘可能最佳且最靈活的方式來利用快速但稀少的RAM的問題。
例如,在商標Java CardTM下,具有複雜的存儲器管理功能的可攜式數據載體是公知的。可從網際網路址「http//java.sun.com/products/javacard」得到的、由「Sun Microsystems,Inc.,Palo Alto,USA」公司於2002年6月公布的文檔「Java CardTM2.2Runtime Environment(JCRE)Specification」描述了為程序(Java卡小應用程式)的執行而在Java卡中提供的環境。第5章描述了典型地將持久對象(persistent object)存儲在數據載體的EEPROM中,而典型地在RAM中創建暫時對象(transient object)。為了安全的原因,不允許將暫時對象存儲在EEPROM中。
例如,如在可從上述網際網路址得到的、由「Sun Microsystems,Inc.,PaloAlto,USA」公司於2002年6月公布的文檔「Java CardTM2.2RuntimeEnvironment(JCRE)Specification」的第81至85頁上所描述的那樣,在剛才描述的Java卡的存儲器管理中,使用特殊的系統調用來生成暫時對象。這限制了在實踐中利用暫時對象的程度。除此之外,這樣的暫時對象具有潛在的不被限制的壽命;術語「暫時」僅指存儲在對象中的數據。因此,在存儲器管理中,使用暫時對象僅帶來靈活性的小幅增加。
在對Java卡進行編程中,慣用且推薦的實踐為在安裝程序(小應用程式)時,靜態地創建在該程序的整個壽命期間需要的所有對象。這在具有預先指定的名稱「install(安裝)」的方法中進行。然而,所述實踐產生具有低靈活性的存儲器管理,因此不是最優的。例如,當在程序中創建暫時欄位(field)、以便存儲用於加密操作的臨時數據時,在RAM中為其靜態保留的存儲器空間通常不可用於其它程序。在該程序內,這樣保留的存儲器空間還用於其它任務的程度取決於程式設計師的專業技能。因此,改善RAM中的稀少存儲器空間的利用率、以及自動化存儲器管理將是所期望的。
發明內容
因而,本發明的問題在於至少部分地避免現有技術的問題,並使用於可攜式數據載體中的存儲器管理的技術可用,利用該技術,改善高效可寫存儲器區域(典型為RAM存儲器)的利用率。特別地,本發明會使在不涉及程式設計師的大量工作的情況下的RAM存儲器的靈活利用成為可能。
根據本發明,通過根據權利要求1的用於在執行程序時的存儲器管理的處理、通過根據權利要求7的用於轉換源程序的處理、通過根據權利要求12的可攜式數據載體、以及通過根據權利要求13的電腦程式產品,而全部或部分地解決了該問題。從屬權利要求涉及本發明的優選實施例。
構成本發明的基礎的基本思想在於,在高效可寫存儲器區域中(例如,在RAM中)自動地創建在可攜式數據載體執行程序時生成的特定對象。為了該目的,特別地,開始考慮僅具有短壽命的那些對象。在本文檔中,這種對象被稱為「局部對象」。例如,本發明所理解的局部對象可以為在出現異常時所生成的異常對象。一旦捕獲了所述異常,異常對象的壽命便終結。
利用本發明,可使臨時需要的存儲器空間在短周期中、且動態地可用-即,以局部對象的形式。在RAM或其它高效可寫存儲器中部分或全部地創建局部對象。作為本發明的自動和動態存儲器管理的結果,尤其良好地利用了該存儲器,這在處理速度方面、以及在有效可用於所執行的程序的存儲器空間的方面,提高了數據載體的效率。
通常,當不再存在對對象的引用時,該對象的壽命處於終結,這是因為隨後不再可能訪問該對象。特別地,可通過不存在對對象的持久引用的事實來定義局部對象。在這裡,將「持久引用」理解為對對象的引用,該引用被持久存儲在例如對象的欄位、靜態欄位或數組的欄位中。一旦將對對象的引用寫入到所述欄位中的一個,該對象便不再能夠成為局部對象。相反,例如包含在操作數堆棧或局部變量中的對對象的非持久引用不影響將對象分類為局部或非局部對象。
可在程序編譯時候或運行時候、或者部分地在程序編譯時候而部分地在運行時候,作出有關將對象視為局部還是非局部對象的區分。在運行時候作出區分的情況下,首先,在第二高效可寫存儲器區域中創建至少一些新生成的對象。在進一步的程序執行期間,執行有關是否創建對該對象的持久引用的監控。一旦處於該情況,該對象便不再被視為局部對象。隨後,將它傳送到第一非易失性存儲器區域中。
在編譯時候作出區分的情況下,編譯器針對是否創建對對象的持久引用而分析包含對象生成的源程序部分。取決於分析的結果,編譯器隨後生成在第一或者——全部或部分地——在第二存儲器區域中創建對象的程序代碼。在本文檔的術語中,術語「編譯器」意指包括執行自動轉換過程的所有程序。因而,除了狹義的Java編譯器之外,「編譯器」還意指例如,表示用於生成CAP文件(Card Application File,卡應用文件)的轉換器、以及優化程序。
通常,在編譯時候的源程序分析能夠提供僅為近似的結果,其被理解為意味著至少將一定程度的不確定性與作為局部或非局部的對象的兩個類別中的一個相關聯。因此,可作出這樣的規定,使得僅在第二存儲器區域中創建被確定地識別為局部的對象,而在第一存儲器區域中創建所有其它對象。相反,在可替換實施例中,僅在第一存儲器區域中創建被確定地識別為非局部的對象,而在第二存儲器區域中創建所有其它對象。隨後,另外,至少對於不可能被確定地識別為局部的對象,進行上述運行時候監控。在某些形式的實施例中,提供編譯器指令(編譯指示),對象可通過其而被特徵化(characterize)為局部或非局部。
在優選實施例中,應用簡單的標準(根據需要,在運行時候或編譯時候),以便確定要在第一還是最初在第二存儲器區域中創建對象。例如,可作出這樣的規定,使得在第一存儲器區域中創建由程序的安裝方法生成的對象。在不同形式的實施例中,既可最初在第二存儲器區域中創建所有其它對象,也可僅創建個別種類的對象。例如,這種對象可為異常對象、或僅僅臨時需要以便執行加密操作的對象。
通常,局部對象的壽命隨著生成該局部對象的方法的終止(由於返回或異常而引起)而終結,這是因為在那個時刻,清除了可能存在的對該對象的局部引用。隨後,可釋放第二存儲器區域中對於該對象可能仍需要的存儲器空間。在使用該對象作為生成了該對象的方法的返回參數時,應用剛才提到的規則的例外。在該情況下,調用方法接收對該對象的引用,使得該對象至少直到該方法的終止也不會被清除。
為了能夠利用第二存儲器區域中被釋放的存儲器空間來創建新對象,在一些形式的實施例中,提供了存儲器清理(垃圾回收)。然而,這在程序執行期間是耗時的,並增加了運行時候環境的複雜度。優選地,因此,使用特別簡單的處理,其中,填充級別(fill-level)指示符表示第二存儲器區域的佔用。在方法的終止時,通常將填充級別指示符重置為在該方法被調用時其所處的狀態。在優選實施例中,僅當通過重置而被釋放的第二存儲器區域的該部分包含用作該方法的返回參數的對象時,才產生該規則的例外。
為了確保在需要時可將對象從第二存儲器區域傳送到第一存儲器區域,優選地,在第二存儲器區域中創建對象時,已經檢查在第一存儲器區域中是否也有用於該對象的足夠空間可用。優選地,還在進一步的程序執行期間確保在創建新對象時,在第一存儲器區域中總是有足夠的空間用於潛在必要的對象傳送。
在優選實施例中,第一存儲器區域位於數據載體的EEPROM、或其它非易失性可寫存儲器中,而第二存儲器區域被安排在RAM或其它高效可寫存儲器中。特別地,第二存儲器區域可為局部堆和/或堆棧存儲器的形式。對於已經在編譯時候被標識為局部對象的對象來說,堆棧存儲器中的存儲是尤其有利的。
根據本發明的電腦程式產品包括程序命令,以便實現根據本發明的轉換處理。這種電腦程式產品可為在其上存儲了用於執行根據本發明的處理的程序的物理介質,例如半導體存儲器、或磁碟、或CD-ROM。然而,該電腦程式產品還可為非物理介質,例如通過計算機網絡而傳送的信號。優選地,該電腦程式產品為供慣用的工作站計算機執行而使用的編譯器,以便生成用於可攜式數據載體的程序。
在優選實施例中,數據載體和/或電腦程式產品具有與上述和/或在從屬處理權利要求中提到的特徵相對應的特徵。
將從下面對示範實施例和多個可替換實施例的特定描述中顯現出本發明的其它特徵、優點和功能。對附圖進行參照,其中圖1是根據本發明的示範實施例的可攜式數據載體的方框圖;圖2是在創建新對象時執行的過程的流程圖;圖3通過例子而圖解了在程序執行期間,在堆棧存儲器和局部堆中的存儲器佔用;圖4是在方法的終止時執行的過程的流程圖;以及圖5是將源程序轉換為可執行程序的圖示。
具體實施例方式
在本示範實施例中,圖1中示出的數據載體10是根據Java卡標準的晶片卡的形式。數據載體10在單個半導體晶片上具有處理器12、以各種技術構造的多個存儲器區域、以及用於無接觸或接觸捆綁(contact-bound)通信的接口電路14。在本示範實施例中,作為存儲器區域而提供固定值存儲器16、非易失性可寫存儲器18、以及寫/讀存儲器20。固定值存儲器16是屏蔽編程ROM的形式,非易失性可寫存儲器18是電可擦寫和可編程EEPROM的形式,而寫/讀存儲器20是RAM的形式。對非易失性存儲器18的寫操作相對費力,並且,例如,需要對寫/讀存儲器20的寫操作的30倍的時間。
數據載體10的操作所需的系統程序22包含在固定值存儲器16中——並且,還部分地包含在非易失性存儲器18中。採用在本質上公知的方式,系統程序22包括作業系統24、以及用於實現虛擬機26的程序代碼26,其中虛擬機26在本示範實施例中是JVCM(Java卡虛擬機)的形式。還提供了類庫28,其產生可用的應用編程接口。在初始化數據載體10時,將Java卡小應用程式形式的程序30加載到非易失性可寫存儲器18中;在可替換實施例中,程序30可以全部或部分地位於固定值存儲器16中。儘管在圖1中僅示出了單個程序30,但還可提供其它的程序,用於由可攜式數據載體10的處理器12執行。程序30包括多個方法30.1、30.2、30.3、30.4,其在下文中被總稱為30.x。採用在本質上公知的方式,方法30.x包括被稱為「安裝」方法的方法,用於程序30的安裝;被稱為「處理」方法的方法,用於處理輸入數據包;以及可選地,「選擇」和「取消選擇」方法,其在數據載體10的多個程序之間改變時被調用。
位於寫/讀存儲器20中的堆棧存儲器32在程序執行期間存放(take up)操作數、返回地址、局部變量、以及其它數據值。在圖1中用陰影線示出了堆棧存儲器32的空閒區域。
在非易失性存儲器18中,保留了第一存儲器區域34,採用在本質上公知的方式,第一存儲器區域34是持久堆的形式。根據慣用的Java卡架構,將在此持久堆中創建所有對象、靜態數據欄位、以及非暫時數組。相反,在本示範實施例中,僅選擇性地使用該持久堆。不在第一存儲器區域34中、而是在寫/讀存儲器20中的第二存儲器區域36中創建預期僅具有短壽命、且無持久引用來引用其的局部對象。第二存儲器區域36還被稱為局部堆,這是因為它類似於持久堆而用於對象的存儲。
為了說明剛才描述的情形,圖1作為例子示出了在第一存儲器區域34中創建的兩個對象38、40,其各自包括多個數據欄位。第一對象38的數據欄位中的一個包含對第二對象40的引用42。引用42還被稱為「持久引用」,這是因為它包含在持久存儲的數據欄位中。第二對象40不是局部對象,而是持久對象,這是因為持久引用42引用它。在第二存儲器區域36中,作為例子示出了局部對象44。例如包含於在堆棧存儲器32中創建的局部變量中的局部引用46引用局部對象44。作為填充級別(fill-level)指示符48,堆棧存儲器32中的另一個值表示第二存儲器區域36中的空閒存儲器的開始;在圖1中用陰影線示出了該空閒存儲器。
在由數據載體10執行程序的時候,當通過命令「新建(NEW)」來請求創建新對象時,執行圖2中示出的過程。首先,在步驟50中,檢查在第一存儲器區域34中是否有足夠的存儲器空間是空閒的,以便創建新對象。如果沒有足夠的存儲器空間可用,則通過錯誤消息來終止對象的生成。在本示範實施例中,無論要被創建的對象的性質如何,均進行步驟50中的檢查,以便確保甚至最初在第二存儲器區域36中創建的對象也可隨時被傳送到第一存儲器區域34。
在本示範實施例中,作出這樣的規定,使得由程序30的「安裝」安裝方法創建的對象總被認為是持久對象,因此將其存放(take up)到第一存儲器區域34中。因此,在步驟52中,查詢當前是否正在執行程序安裝。如果是,則在步驟54中,在第一存儲器區域34中作為持久對象生成新對象。在步驟54中執行的生成過程與在慣用的Java卡的情況下執行的在持久堆中創建對象相對應。
如果在步驟52中確定程序執行處於安裝方法之外,則在本示範實施例中,要被創建的新對象最初被視為局部對象。隨後,倘若在步驟56中檢查出在第二存儲器區域36中有足夠的存儲器空間是空閒的,則在第二存儲器區域36(局部堆)中創建它。如果在局部堆中有足夠的存儲器空間可用,則在步驟58中,在其中的下一個空閒位置(與迄今使用的區域緊鄰)創建該對象,並且相應地更新填充級別指示符48。然而,如果局部堆已經過滿,則在步驟54中執行第一存儲器區域34中的對象創建的慣用過程,在該區域中,當然,如在步驟50中所檢查的那樣,仍有足夠的空閒存儲器空間可用。
在由數據載體10進一步執行程序30的期間,每當生成或修改持久引用時,檢查該引用是否引用位於第二存儲器區域36中的對象。如果是,則將該對象從第二存儲器區域36傳送到第一存儲器區域34中。由於步驟50中的查詢而確保了這隨時都是可能的。
在本示範實施例中,類似於堆棧存儲器而組織第二存儲器區域36,以便在終止方法30.x之後,可以簡單的方式來釋放在該方法30.x中生成的局部對象所佔用的存儲器空間。為了說明該過程,圖3作為例子示出了具有幾個堆棧幀60.1、60.2、60.3的堆棧存儲器32的佔用。採用在本質上公知的方式,當調用每個方法30.x時,創建新堆棧幀60.x,其在終止方法30.x時再次被清除。堆棧幀60.x包含到調用方法的返回地址、管理和安全性數據,並且可選地還包含被調用方法的局部變量。
在本示範實施例中,每個堆棧幀60.x還具有填充級別欄位62.x,其包含在執行所述方法30.x期間的填充級別指示符48。在作為例子給出的圖3的圖解中,填充級別欄位62.3包含當前填充級別指示符48,而填充級別欄位62.2包含在調用與堆棧幀60.3相對應的方法時當前的填充級別。部分64.3表示自從當前執行的方法被調用以來已被該方法新佔用的局部堆中的部分。局部堆中的部分64.1和64.2分別由其調用引起存儲器幀60.1和60.2的創建的那些方法來填充。
在目前描述的示範實施例中,作出了這樣的規定,使得在終止方法時,通常完全地釋放由該方法在第二存儲器區域36中佔用的空間。這利用這樣的事實而不費力地發生,該事實即在終止方法時,丟棄(discard)對應的堆棧幀60.x(包括其中所包含的填充級別欄位62.x),並使用具有存儲在其中的其佔用內容的下一個最舊堆棧幀60.(x-1)的填充級別欄位62.(x-1),作為新填充級別指示符48。因而,例如,在終止其調用引起堆棧幀60.3的創建的那個方法之後,使用填充級別欄位62.2的內容,作為新的填充級別指示符48,以便釋放整個存儲器部分64.3。
在剛終止的方法向調用方法返回對它已在第二存儲器區域36中創建的局部對象的引用時,存在在前一段落中給出的規則的例外情況。在該情況下,將當前填充級別欄位62.x的內容複製到下一個最舊的堆棧幀60.(x-1)中,以便防止局部對象被覆寫。例如,在圖3的存儲器佔用配置中,當已創建了存儲器幀60.3的方法返回對位於存儲器區域64.3中的對象的引用時,將填充級別欄位62.3的值複製到前一個堆棧幀60.2的填充級別欄位62.2中。
在圖4中再次圖解了剛才描述的在終止方法時的過程。取決於步驟70的結果,重新激活前一個堆棧幀60.(x-1)的填充級別欄位62.(x-1)(步驟72),或將當前填充級別指示符48的值轉移(carry over)到前一個堆棧幀60.(x-1)中。
圖5示出了本質上公知的由編譯器82將Java源程序80翻譯為CAP文件(卡應用文件)84的翻譯過程。然後,由加載程序86將CAP文件84加載(例如,在初始化數據載體10時)到數據載體10中,作為程序30。在這裡描述的示範實施例中,除了用於將源程序80翻譯為字節碼的實際編譯模塊之外,編譯器82還具有轉換器,其進行各種正確性檢查,並且,其還被稱為「離卡虛擬機(off-card Virtual Machine)」。
在迄今描述的處理的情況下,為了決定應當在第一還是第二存儲器區域34、36中生成新創建的對象,在步驟52中在運行時候執行簡單的查詢。在持久引用的創建和更新時,進行進一步的運行時候檢查。相反,在可替換實施例中,作出這樣的規定,使得所述檢查全部或部分地提前到編譯器82的級別。
利用對源程序80或中間代碼的抽象(abstract)分析,編譯器82可獲得有關要在以後的程序執行期間新創建的對象被視為局部還是非局部對象的信息。取決於分析的結果,編譯器82則生成程序代碼,其引起在第一存儲器區域34中或在第二存儲器區域36中創建對象。在可替換實施例中,在堆棧存儲器32中創建已在編譯時候被確定地識別為局部的對象,如局部變量。取決於是否在寫/讀存儲器20中額外提供局部堆,那些實施例中的堆棧存儲器32形成整個第二存儲器區域36、或第二存儲器區域36的一部分。
通常,將向源程序提供用於生成對象的命令,其中在編譯時候不能無歧義地將所述對象分類為局部或非局部對象。既可在第一存儲器區域34中直接創建這樣的對象,也可以前述方式在第二存儲器區域36中將這樣的對象最初創建為局部對象,並僅在需要時將其傳送到第一存儲器區域34。
權利要求
1.一種用於在由可攜式數據載體(10)執行程序(30)時的存儲器管理的處理,該可攜式數據載體(10)具有第一和第二存儲器區域(34、36),用於存儲在程序執行時生成的對象(38、40、44),其中,執行對第二存儲器區域(36)的寫操作比執行對第一存儲器區域(34)的寫操作更高效,該處理包括以下步驟-至少部分地在第二存儲器區域(36)中創建在程序執行時生成的對象(38、40、44),以及-如果在進一步的程序執行的過程中,生成對該對象(38、40、44)的持久引用(42),則將該對象(38、40、44)傳送到第一存儲器區域(34)。
2.如權利要求1所述的處理,其特徵在於,在程序(30)的方法(30.x)的執行期間生成對象(38、40、44);並且,在該方法(30.x)終止時,至少在該方法(30.x)不返回對對象(38、40、44)的引用時,釋放可能仍由對象(38、40、44)佔用的第二存儲器區域(36)中的存儲器空間。
3.如權利要求2所述的處理,其特徵在於,在方法(30.x)終止時,至少在該方法(30.x)不返回對位於第二存儲器區域(36)中的對象(38、40、44)的引用時,將指示第二存儲器區域(36)的佔用的填充級別指示符(48)重置為在調用方法(30.x)時當前的級別。
4.如權利要求1至3中的任一項所述的處理,其特徵在於,當在第二存儲器區域(36)中創建對象(38、40、44)時,檢查在第一存儲器區域(34)中是否有足夠的空間用於可能變得必要的對象(38、40、44)的傳送。
5.如權利要求1至4中的任一項所述的處理,其特徵在於,在第一存儲器區域(34)中,創建在程序(30)的安裝期間生成的對象(38、40、44)。
6.如權利要求1至5中的任一項所述的處理,其特徵在於,最初僅在第二存儲器區域(36)中創建在從源程序(80)生成程序(30)時已被標識為局部對象的對象(38、40、44)。
7.一種用於將源程序(80)轉換為供可攜式數據載體(10)執行的程序(30)的處理,其中,該數據載體(10)具有第一和第二存儲器區域(34、36),用於存儲在程序執行時生成的對象(38、40、44),並且其中,執行對第二存儲器區域(36)的寫操作比執行對第一存儲器區域(34)的寫操作更高效,其特徵在於,在轉換包含對象(38、40、44)的生成的源程序(80)的一部分時,至少近似地檢查在所轉換的源程序(80)的一部分中是否生成對對象(38、40、44)的持久引用(42);並且,取決於該檢查的結果,生成在第一存儲器區域(34)中創建對象(38、40、44)的程序代碼,或者生成至少部分地在第二存儲器區域(36)中創建對象(38、40、44)的程序代碼。
8.如權利要求7所述的處理,其特徵在於,所生成的程序(30)被配置為在由數據載體(10)執行時,執行根據權利要求1至6中的任一項所述的處理。
9.如權利要求1至8中的任一項所述的處理,其特徵在於,在第二存儲器區域(36)中創建的對象(38、40、44)是局部、且僅僅臨時需要的對象。
10.如權利要求1至9中的任一項所述的處理,其特徵在於,第二存儲器區域(36)包括局部堆和/或堆棧存儲器(32)。
11.如權利要求1至10中的任一項所述的處理,其特徵在於,數據載體(10)為Java卡;並且程序(30)為Java卡小應用程式。
12.一種可攜式數據載體(10),特別是晶片卡或晶片模塊,其具有處理器(12)、以及至少一個存儲器(16、18、20),其中,存儲器(16、18、20)包含程序命令,其使處理器(12)執行根據權利要求1至6中的任一項所述的處理。
13.一種電腦程式產品,特別是編譯器(82),其包括程序命令,該程序命令使計算機執行具有權利要求7或權利要求8的特徵的處理。
全文摘要
本發明涉及一種用於在通過可攜式數據載體(10)執行程序(30)時的存儲器管理的方法,該可攜式數據載體(10)包括第一和第二存儲器區域(34、36),用於存儲在程序執行時生成的對象(38、40、44)。首先,至少部分地在第二存儲器區域(36)中創建對象(38、40、44)。如果在進一步的程序執行期間生成對該對象(38、40、44)的持久引用(42),則將該對象傳送到第一存儲器區域(34)。根據用於將源程序(80)轉換為可執行程序(40)的方法,在編譯時,檢查是否生成對要被新創建的對象(38、40、44)的持久引用(42)。取決於此檢查的結果,生成在第一或至少部分地在第二存儲器區域(34、36)中創建對象(38、40、44)的程序代碼。本發明提供了一種用於在可攜式數據載體(10)中的存儲器管理的裝置,其改善了高效可寫存儲器區域的利用率。
文檔編號G07F7/10GK1781127SQ200480011319
公開日2006年5月31日 申請日期2004年5月4日 優先權日2003年5月6日
發明者託馬斯·斯託克, 喬格·克拉姆波斯特休伯 申請人:德國捷德有限公司