天天看點

學習JCVM之二JCVM的工作原理

學習JCVM之二JCVM的工作原理

一、下面是智能卡的一個結構圖:

學習JCVM之二JCVM的工作原理
學習JCVM之二JCVM的工作原理

JCRE就是智能卡java程式運作的環境,主要包括JCVM、核心API類庫、本地方法,

1.下面介紹一下智能卡的工作原理:

首先,源代碼經過 Java 編譯器編譯後産生類檔案,也稱為位元組碼。

然後,Java 智能卡轉換器将類檔案轉換成一個 CAP 檔案。轉換器主要的功能是對位元組碼檔案進行優化以适合在卡中有限的記憶體中運作。

以上都是在卡外虛拟機完成的。

下面都是在java卡運作環境中完成的。

接下來就是将 CAP 檔案下載下傳到卡中。每個 Applet 都會被賦予的一個特定AID(這個AID是怎麼賦予我不太清楚,現在也不需要清楚)。當一個Applet被正确下載下傳到EEPROM後,并與Java智能卡類庫和卡上的其它庫關聯後,JCRE就調用該Applet的安裝方法install來安裝該Applet。install是一種公共靜态方法(JAVA卡不支援動态加載),用來建立Applet的一個執行個體,此時,JCRE會調用解釋器來完成建立執行個體的工作。同時,JCRE會在Applet系統資料庫中進行記錄。由于存儲器有限,通常在這一階段建立和初始化Applet生命期内需要的對象。

安裝在卡上的 Applet 還需要被顯式地選擇後才會被激活。就是終端裝置給卡發送的APDU指令,當 JCRE 接受到“SELECT APDU”指令時。JCRE 暫停目前選中的 Applet,并調用該 Applet 的deselect 方法進行清理。然後,JCRE 根據指令中的 AID 選中對應的 Applet,調用該 Applet 的 select 方法。如果是多個邏輯通道選擇了這個 Applet,需要調用它的Multiselectable.deselect 方法。select 方法讓該 Applet 做好接受 APDU 指令的準備。所有接受到的 APDU 指令 JCRE 将發送給目前選中 Applet 的 process 方法,此時JCRE 會調用解釋器,将系統的控制權交給解釋器,直到它接收到下一個“SELECTAPDU”指令為止。

解釋器啟動後,進行必要的初始化,就跳轉至目前 Applet 的 process 方法中,根據具體的位元組碼進行解釋執行。這時,解釋器就如同使用不同語言的人在交流時所需要的翻譯一樣,使得用 Java 語言編寫的程式可以運作在不同的系統上,使得 Java“一次編寫,到處運作”的理念得以實作。當 Java 棧中為空時,解釋器會将系統控制權轉交給 JCRE。

二、Java卡的虛拟機有兩部分組成:卡内虛拟機和卡外虛拟機

1.卡外虛拟機的工作原理:

卡外虛拟機工作在PC平台,它将Java源檔案進行編譯轉換,轉化後的位元組碼檔案稱為CAP檔案,即為将要下載下傳到Java卡上的安裝檔案.

Java卡應用程式的開發與其它Java應用程式的開發在開始階段是相同的,開發者編寫一個或多個Java類的源代碼,經Java編譯器編譯成一個或多個類檔案。相應的類檔案用Java卡轉換器轉換成CAP檔案,轉換完成後,CAP檔案被傳到卡内虛拟機,卡内虛拟機執行CAP檔案中的程式代碼。CAP檔案是兩部分虛拟機的接口檔案,CAP檔案由卡外虛拟機産生,卡内虛拟機使用。

CAP檔案可下載下傳并安裝到卡内,其中包括可執行代碼,CAP檔案與JCVM的關系相當于類檔案與JVM的關系。CAP檔案由Java卡外虛拟機的轉換器産生,一個包中的所有類轉換完成後都存于同一CAP檔案中,其轉換過程見圖4。EXPORT檔案存有卡内虛拟機操作所必須的資訊,可以由轉換器在轉換一個包時産生,其它引用此包中類的程式在轉換時要用到此包的EXPORT檔案,轉換的CAP檔案中包含EXPORT檔案的資訊,卡内虛拟機用此資訊連結包中相關項目(類、接口、域、方法)。轉換器将Java卡applet用到的同一包中的所有類轉換成一個CAP檔案,CAP檔案由一系列構件組成,這些構件的功能各不相同。CAP檔案與類檔案相比,結構更加緊湊、短小,對類、方法、域的表示比較簡單,是基于标記的連結方式(Token based linking),這樣,Java卡處理起來更有效。同時,在類檔案向CAP檔案的轉換過程中,可以做各種優化處理。

學習JCVM之二JCVM的工作原理

2.卡内虛拟機原理:

卡内虛拟機則工作在智能卡平台,它對下載下傳到卡上的CAP檔案位元組碼解釋執行,将之轉化為相關的本地硬體實作.

卡内虛拟機執行位元組碼、管理類和對象、提供各種Java卡應用程式之間的防火牆、提供保密資料共享等。由于智能卡環境中的資源很有限,是以采用解釋執行的方式,且其堆棧模型、堆的存儲器組織、異常處理方式都各有特點。

卡内虛拟的主要子產品:

JavaCard虛拟機是JavaCard的工作引擎,其大體結構較Java其他版本的虛拟機簡單,包括Java位元組碼解析器、Java棧、Java堆、方法區、異常處理子產品等。

1.Java位元組碼解析器對所有的Java語言位元組碼進行解析執行;就是當解釋器解析CAP檔案時,從方法區調用該應用程式對應的類和方法以及靜态域來完成對對應用程式的解析。

2.Java棧是Java語言執行時方法調用的工作區;JCVM是以棧為基本存儲機制的處理機。棧的特點是先進後出(FILO)。對每個類的每個方法,JCVM都定義一定的棧空間,是在我們需要調用類的方法的資訊壓入到棧中。

3.Java堆用來存儲永久和臨時的對象資料:

堆的技術是為了存放Java程式運作時建立的所有執行個體或者數組。在處理位元組碼對象建立指令時,Java卡虛拟機要在堆中為其配置設定存儲空聞。

4.方法區是Java類庫的所在地,這是Java的基礎功能子產品,包括本地方法和純Java類方法。

5.異常處理子產品

6. Java Card虛拟機的Java棧工作在卡的RAM中,方法區在卡發行時被掩模到ROM中,而Java堆被配置設定到EEP-ROM或是Flash上。

類庫的解析過程分析

API 類庫實作時所要解決的第一個重要問題就是如何由編譯後的位元組碼資訊找到所引用的API類、方法和域。在Java智能卡中,無論類庫還是應用程式Applet,轉換器已經為所有類和執行個體化方法都配置設定了一個值,稱為 token 值。Applet 運作時,解釋器根據 token 值作為索引标記,利用 CAP 檔案各元件所包含的具體包資訊、類資訊、方法資訊和域資訊,完成對類的引用、方法引用和域引用的解析,這就是 token 的動态連結原理。是以,針對該問題所要研究的就是解釋器對 Applet中調用外包方法的具體解析過程。

在 Java 智能卡應用程式 Applet 運作時,如果引用了外包中的方法,解釋器将獲得引用的外包的索引,以類和方法 token 值作為索引标記,通過 CAP 檔案中各元件中具體的包資訊、類資訊和方法資訊,可以準确地完成從 token 值跳轉到被引用方法的具體實作。這一過程主要涉及到 Export 檔案和 CAP 檔案。                                                                         

Export 檔案主要描述了 Applet 和引用的包之間的關聯資訊,包含了目前類所在包完整的公有的方法的連接配接資訊,并且為目前包中類、方法和域都配置設定了不同的 token 值。

CAP 檔案不僅包含一個程式包自身的内容,而且包括本包和其他程式包的連結資訊。它是 Java 源代碼經過編譯後生成的 class 檔案,再經過 Converter 轉換器後生成的二進制檔案,然後被 JCRE 下載下傳并安裝到卡上,解釋器将進行解析,具體格式已由 Java 智能卡虛拟機規範給出

硬體系統的要求:

最底層是硬體系統,主要是為了保證Java智能卡運作環境的需要。

Java智能卡對硬體配置的最低要求為

8 位處理器;

512 位元組的 RAM:主要用于存儲應用程式運作時的棧和輸出輸入

緩沖區;

24KB 的 ROM:主要用于存儲程式類庫和系統的運作時系統;

8KB 的 EEPROM:主要用于存儲 Java 智能卡的 Applet 和堆