摘 要: 介紹了Java Card虛擬機的相關知識,,并就其存儲資源有限的特點,提出了一套有效的資源管理策略和一個符合規(guī)范且可行的棧與幀的結構設計方案,,詳細說明了該方案中棧與幀的執(zhí)行過程,。
關鍵詞: Java卡;Java卡虛擬機,;棧,;幀;存儲空間
近年來,,智能卡已經(jīng)越來越廣泛地應用于社會生產(chǎn),、生活的各個領域,相關技術也得到了迅猛發(fā)展,。Java技術具有安全,、簡單、即時編譯和跨平臺的眾多優(yōu)點,,將Java技術運用于智能卡的開發(fā)領域,,已經(jīng)成為智能卡技術發(fā)展的熱點。Java卡是一種能運行Java應用程序的智能卡,,支持部分Java編程語言,,是Java技術和智能卡的一個成功結合,。Java卡技術的核心是Java卡虛擬機JCVM(Java Card Virtual Machine),。不同于一般的Java虛擬機,由于受到智能卡存儲與處理能力的限制,,JCVM的可用資源非常有限,。通常JCVM對于內部資源的管理和使用非常嚴格。
1 JCVM和相關技術簡介
由于智能卡的可用資源非常有限,,不可能在智能卡內實現(xiàn)JCVM的全部功能,,所以,通常將JCVM分為卡外虛擬機和卡內虛擬機兩部分,??ㄍ馓摂M機可運行于一般的PC或SUN工作站上,主要工作是將由Java語言編寫的class文件轉換成為字節(jié)碼形式的CAP文件,。而卡內虛擬機在智能卡內部實現(xiàn),,負責裝載,、執(zhí)行字節(jié)碼和支持Java語言。下面所說的JCVM主要是指卡內虛擬機部分,。Java卡應用程序的開發(fā)和其他Java應用程序的開發(fā)在最初階段基本相同,,開發(fā)者編寫若干Java類源代碼,利用Java編譯器編譯成類文,。然后,,將相應的類文件用Java卡轉換器轉換成為CAP文件,CAP文件相比起類文件更加緊湊,、短小,,將其下載到卡內虛擬機??▋忍摂M機執(zhí)行CAP文件中的代碼,,完成應用的安裝,使應用處于能夠被卡內虛擬機執(zhí)行的狀態(tài),。
對于JCVM的載體,,Java卡的系統(tǒng)結構如圖1所示。
Java卡系統(tǒng)主要由三個部分組成:COS和本地方法層,、JCRE,、Java卡應用程序。其中,,JCRE包括JCVM,、Java Card API和企業(yè)添加類。
在系統(tǒng)結構圖1中,,位于最下層的COS和本地方法層主要用于對智能卡的硬件進行管理和操作,。JCRE是Java卡的核心部分,主要工作是維護Java卡系統(tǒng)運行時的環(huán)境,,同時也負責應用的執(zhí)行和安全,。JCVM是完成Java程序字節(jié)碼解析和執(zhí)行的主要部分。最上面的是Java卡應用程序,。Java卡允許一卡多用的存在,,當卡中有多個應用時,應用需要通過被選擇,,才能處于工作狀態(tài),,其程序字節(jié)碼才能通過JCVM進行解析和執(zhí)行。
從圖1所示可以明確得到JCVM在Java卡內所處的層次關系,。JCVM本身是JCRE的一部分,。JCVM通過調用COS提供的命令和一些本地方法,控制硬件的運算,、存儲等操作,。JCVM被各個Applet通過企業(yè)添加類和API調用,,執(zhí)行應用程序的字節(jié)碼。
2 JCVM實現(xiàn)難點
對于JCVM棧與幀結構的實現(xiàn),,主要難點可以歸結為以下幾點:
(1)智能卡因為其受到存儲空間的限制,,需要一套科學有效的管理和利用方案,以保證存儲空間的高效使用,。
(2)JCVM中棧與幀的結構設計,,需要做到既能高效地利用有限的空間,同時又能保證Java應用程序正常執(zhí)行,。
(3)在棧中,,如何實現(xiàn)幀的創(chuàng)建和銷毀,這并非只是簡單地申請空間或釋放空間的操作,,而且還包括整個程序執(zhí)行過程的相關動態(tài)鏈接,、全局控制等數(shù)據(jù)的處理。
(4)如何符合規(guī)范地進行幀內部數(shù)據(jù)的處理,。
下面將就這些實現(xiàn)難點進行分析,,提出設計思路和解決方案。
3 JCVM中存儲空間的劃分
因為受到智能卡平臺的資源限制,,JCVM中的存儲空間非常有限,。為了能夠科學節(jié)約地使用和管理這些空間,將JCVM的存儲空間虛擬劃分為以下部分:
(1)應用代碼區(qū):用于存儲CAP文件通過安裝器安裝以后的中間代碼,,主要是方法字節(jié)碼等,。
(2)靜態(tài)變量區(qū):用于存儲非易失性應用數(shù)據(jù)內容,一般是應用的域,、應用處理的最終結果,、方法調用過程中Token和方法地址的轉換表、常量池等重要信息,。應用可以通過相關的指令讀寫靜態(tài)空間存儲的各種內容,。
(3)信息共享區(qū):屬于易失性存儲區(qū)域,主要用于公共信息內容的交換,,由OS負責提供,,應用和終端均可訪問OS中的內容,。其主要存儲APDU的內容,,也存儲棧運行過程中需要用到的一些臨時變量。
(4)方法執(zhí)行區(qū):用于虛擬機執(zhí)行過程中棧操作的空間,,保存運行的執(zhí)行數(shù)據(jù),、中間結果等。
應用代碼區(qū)和靜態(tài)變量區(qū)可以通過文件系統(tǒng)進行存儲,,保存在智能卡的Flash中,。信息共享區(qū)和方法執(zhí)行區(qū)一般通過物理地址讀寫,,保存在智能卡的RAM中。
4 JCVM中棧與幀的執(zhí)行對象
由于具有方便移植,、安全和程序代碼小等優(yōu)點,,JCVM中執(zhí)行的程序都是以字節(jié)碼的形式存在,而棧與幀的主要執(zhí)行對象就是存放在應用代碼區(qū)的Java卡應用程序方法字節(jié)碼,。方法字節(jié)碼由2個或4個字節(jié)的方法頭和之后若干長度的方法執(zhí)行字節(jié)碼組成,。方法頭中主要包含了max_local,max_stack,,narg等信息,,其中,max_local指出了該方法需要申請用于局部變量區(qū)數(shù)組的空間大小,,max_stack指出了該方法需要申請用于操作數(shù)棧執(zhí)行的空間空間大小,,narg則說明了需要傳遞的參數(shù)個數(shù)。這些信息為之后創(chuàng)建相應的幀提供了重要的信息,。而方法執(zhí)行字節(jié)碼則是一串符合JCVM規(guī)范并得以實現(xiàn)該方法的16字節(jié)操作碼,。
5 JCVM中棧與幀的結構設計
通過對JCVM中存儲空間的劃分,可以得到一片預留的區(qū)域(即方法執(zhí)行區(qū))用于專門實現(xiàn)JCVM中棧的虛擬,。給這片預留的區(qū)域制定一個類似于棧先進后出的操作規(guī)則,,即為虛擬的出棧。而入棧的基本單位,,則為幀(Frame),。幀和方法具有一一對應的映射關系,每調用一個方法,,就需要創(chuàng)建一個幀,,并且入棧,而當方法執(zhí)行完并返回值之后,,相應的幀也將出棧并銷毀,。
幀主要用于存儲數(shù)據(jù)和操作結果,返回方法的值,。它主要由局部變量區(qū),、操作數(shù)棧和幀控制信息(FrameCI)組成。局部變量區(qū)主要是以1個單元,,也就是2個字節(jié)作為其基本單位的局部變量數(shù)組(local variable array),,而存在其中的每一個元素都是屬于該方法的一個local array。其主要用來存儲方法傳遞的參數(shù)和相關變量,,是數(shù)組的結構,,在字節(jié)碼執(zhí)行過程中,通過數(shù)組的索引值進行讀寫,。操作數(shù)棧(operand stacks)也是以1個單元作為其基本單位,,是字節(jié)碼執(zhí)行過程中用于臨時存儲中間數(shù)據(jù)和操作結構的一片預留區(qū),,根據(jù)相應方法的方法頭信息確定預留空間的大小,通過執(zhí)行字節(jié)碼進行出入操作數(shù)棧的操作,。此外,,在調用方法的時候,操作數(shù)棧還負責存儲傳遞給該方法的參數(shù)值以及存儲由該方法返回的返回值,。而幀的控制信息主要包括當前方法物理地址(thismethodP),、當前方法上下文(thiscontext)、調用者幀的地址(invmethodP),、調用者方法Bytecode執(zhí)行進度(invbytecodenum),、調用者方法操作數(shù)棧指針(invoperandSP)。這些信息將棧中的每一個幀都動態(tài)鏈接起來,,并起到對每個方法執(zhí)行進度進行記錄的作用,。當前方法物理地址用于讀取當前方法的Bytecode,上下文的作用相當于防火墻,,用來阻止跨界的非法訪問,,調用者方法物理地址是在當前方法執(zhí)行完成后讀取調用者幀的地址,調用者方法Bytecode執(zhí)行進度和操作數(shù)棧指針用于還原調用者幀的在調用前的現(xiàn)場,。
棧與幀的結構設計如圖2所示,。
6 方法調用與返回操作的處理
如圖2所示,每一個運行的方法對應著一個幀的結構,。當一個方法需要調用另一個方法時,,首先要求將被調用者方法的參數(shù)壓入當前幀的操作數(shù)棧中,然后為該新方法創(chuàng)建一個新的幀,,并入棧,,將新的幀設置為當前幀。創(chuàng)建新幀的過程,,首先是分配一個足夠大小的空間給新的幀,,這里,通過讀取該方法的方法頭,,可以準確知道局部變量和操作數(shù)棧所需要的空間大?。蝗缓蟪跏蓟瘞?,將新方法的相關信息傳入FrameCI,,并對一些全局變量和指針進行修改;接著是參數(shù)的傳遞,。在Java卡中,,新方法所需要調用的參數(shù)之前已經(jīng)被壓入調用者方法的幀中,,在不考慮疊加技術的情況下,,當方法調用執(zhí)行時,,先將參數(shù)從調用者方法幀的操作數(shù)棧中出棧,然后在順序進入新方法幀的局部變量區(qū),,最后根據(jù)新方法的Bytecode,,執(zhí)行相關操作。
對應方法結束的操作,,需要銷毀一個幀,。這里的方法執(zhí)行結果分為正常結束執(zhí)行和不正常結束執(zhí)行。在正常結束執(zhí)行的情況下,,有可能會有一個返回值給調用者方法,,這時,首先將返回結果出該幀的操作數(shù)棧,,通過invmethodP找到調用者幀,,將調用者幀設為當前幀,再進調用者幀的操作數(shù)棧,。然后修改相關全局變量和指針的值,。最后回收原方法幀的使用空間,以留給下次幀的創(chuàng)建,。若是不正常結束執(zhí)行,,虛擬機內將產(chǎn)生exception或因執(zhí)行到一個拋出指令而拋出exception,這時的方法就不會有返回值返回給調用者了,。
另外,,之前提到的疊加技術,就是在實現(xiàn)JCVM時,,可以將調用者方法幀操作數(shù)棧和被調用者方法幀的局部變量區(qū)進行疊加的技術,,即不需要把之前壓入到調用者方法幀操作數(shù)棧中的參數(shù)出操作數(shù)棧再寫到被調用者方法幀的局部變量區(qū),而是直接將調用者方法幀操作數(shù)棧的參數(shù)部分看做被調用者方法幀的局部變量區(qū)的一部分,,使之實現(xiàn)部分區(qū)域重合,。采用疊加技術不會對方法的創(chuàng)建和銷毀產(chǎn)生任何影響,卻能簡化方法間參數(shù)傳遞的機制,,同時有效節(jié)約方法執(zhí)行區(qū)的空間,。
7 幀內部數(shù)據(jù)的操作
除了方法調用需要用到的棧操作之外,事實上在JCVM中,,更多的是幀內部數(shù)據(jù)的操作,。這些操作主要包括對局部變量區(qū)的讀寫操作和對操作數(shù)棧的出入棧操作。這些操作連同調用方法的操作一起,,完成整個方法的執(zhí)行,。
例如,有這樣一個方法short add(short a,short b),,其執(zhí)行步驟如下:
Sload_1 //Load short from local variable 1,,then push
Sload_2//oad short from local variable 2,then push
Sadd//Pop two shorts,,add them,,then push the result
Sstore_3//Pop,then store short into local variable 3
Sreturn//Return short from method,,then destroy the Frame
當有某方法需要調用這個方法時,,首先根據(jù)方法頭創(chuàng)建幀結構,將局部變量區(qū)和操作數(shù)棧初始化,,控制信息賦值,,接著根據(jù)方法的執(zhí)行指令對操作數(shù)棧和局部變量區(qū)進行操作。具體操作步驟如圖3所示,。
在上例的幀執(zhí)行演示中,,圖3的初始化步驟是根據(jù)方法頭進行空間的申請,并將相關數(shù)據(jù)進行初始化賦值,。Objectref是對象引用,,視具體調用方法而定,一般調用中會以參數(shù)的形式傳給新的方法幀,,賦值給Local variable 0,,而相關參數(shù)a、b,,也以參數(shù)形式在新的方法里分別賦值給Local variable 1,、Local variable 2。而方法字節(jié)碼的前兩個指令,,將存儲在局部變量區(qū)索引為1,、2的兩個數(shù)據(jù)壓入操作數(shù)棧,其后Sadd指令從操作數(shù)棧中彈出這兩個數(shù)據(jù),,進行加法,,再將結果壓回操作數(shù)棧中。然后Sstore_3從操作數(shù)棧中彈出結果值,,存儲到局部變量區(qū)索引為3的位置,。最后,Sreturn將該方法幀銷毀,,完成該方法的全過程,。
通過對JCVM開發(fā)規(guī)范和一些智能卡開發(fā)公司需求和測試文檔的研究和分析,本論文中所提出的存儲資源管理策略,,棧與幀結構的設計完全符合要求,。通過利用各大公司提供的軟件模擬環(huán)境和Applet應用數(shù)據(jù)包對棧與幀的設計方案進行測試,證明該方案正確可行。
JCVM中棧與幀的設計與實現(xiàn)是開發(fā)JCVM的核心問題,。本文提出了符合JCVM開發(fā)規(guī)范的棧與幀的結構設計和執(zhí)行策略,,并對存儲空間進行劃分管理,優(yōu)化了有限的智能卡存儲空間,,并成功使用疊加技術改進了參數(shù)傳遞的機制,,很好地完成了JCVM中棧與幀的基本功能,。本文的研究已經(jīng)成功運用到華大電子股份有限公司和清華同方公司的芯片上,,并已經(jīng)通過相關部門的軟件測試。
參考文獻
[1] 接觸式智能卡國際規(guī)范[S].ISO7816(1-9).
[2] Java Card 2.2.2. Virtual Machine Specification[S]. 2006.
[3] Java Card 2.2.2. Application Programming Interface[S]. 2006.
[4] Java Card 2.2.2. Runtime Environment Specification[S]. 2006.
[5] Java Card Forum. http://www.javacardforum.org/.
[6] 吳東輝,,周捷,,陳章龍.Java卡的設計[J].微型電腦應用, 2003,,19(12).