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