第四章 系統軟體介紹
4.1. 物件型別解析器(C LASS P ARSER )說明
關於物件型別解析器的功能在於當 JAIP 執行的過程中,對 JAIP 所需要執行的物件型別 檔,產生適用於我們平台的映像檔(Run Time Image),以非主動的方式去對原始的物件型別 檔做解析,並因為完成解析的物件型別其映像檔會在記憶體中保留一份,所以對物件型別作 解析僅為一次性的動作,對於長時間在運作的系統也能接受這樣額外增加的負擔。
圖13. 在 Cross Reference Table 上每一個 Class 的資料結構
物件型別解析器會針對要解析的物件型別檔,先在 JAR 檔上做搜尋,我們的系統在啟動 Cross reference table
Class [x]
Attributes Class I D , Class name, image address, etc
Parent_id Class ID
Object Size Size (byte)
IsParsed 1 or 0
Interface Info IsInterface (1 or 0) Interface Count Interface List Field Data[i] Field Name Class I D & Field Offset Field Tag
Method[i] Method Name Class I D & Method Offset
Ldc[i] Data Type
String Pool The whole string data stored in constant pool String Pool Offset[i] The of fset for each string
記憶體空間,這個資料結構欄位中放的只是指向另外記憶體空間的位址,會這樣做的原因在 於硬體電路在做 Field Data 存取及 Invoke Method 都需要經常查找這個資訊,所以將存放這項 資訊的記憶體會統一整理安排在 on-chip 的 BRAM 上用來加速查找的動作,在圖 13 上這兩個 欄位先以簡化的方式表示其意義。
圖14. 物件型別解析器演算法流程
上圖 14 是我們物件型別解析器在先不考慮繼承以及介面機制的實作,只是針對單一物件
p ar se _c las sfi le (cl as s_l oa de r.c ) re sol u ti on par si ng
Constant pool reconstructing Super class resolution
Field_info structure resolution Method_info structure resolution
Reference field resolution Reference method resolution
Return to Java core Ldc data resolution Class simple table resolution
Class data resolution
Interface resolution
型別去做解析的流程,這邊將流程中的行為主要區分為 parsing 及 resolution 兩大 類,其 parsing 所表示的意思是其行為發生在解析物件型別格式(class format)內容時會做的,而 resolution 則是指對常數索引區段中部分會使用到的資訊,做進一步的轉換,接著我們針對流程中每一 個步驟去做說明。
4.1.1.
常數索引區段(Constant pool)的結構修改物件型別解析器主要提供的功能其中一項是對 JAVA 物件型別檔中的常數索引區段
(Constant Pool)進行結構修改,以簡化電路查找特定參考值的流程,原始的常數索引區段 使用不同的標籤去表示每一個欄位的資料意義,並在每一筆資料內可以藉由常數索引區段的 索引值再去找到其他欄位的資料來定義自己,如此反覆的查找最後才能知道完整的資訊,這 邊 圖 15 是使用常數索引區段的索引值定義物件型別名稱的例子,而這樣在常數索引區段查 找的動作(Resolution)會在執行解析的過程中頻繁出現,並且在不同標籤所代表的欄位資料 在常數索引區段中的長度上也不是統一的,所以在查找的過程中需要逐一掃過小於索引值的 所有欄位,當我們今天執行在執行的 JAVA bytecode 跟隨 Operand 是指向的是常數索引區段 中的索引值時,這樣查找的動作更會影響我們在執行上的效能,所以在解析的過程中,我們 這邊針對常數索引區段的處理會在第一次掃過所有常數索引區段時建立索引記錄每個欄位的 起始位址,加快在後續解析物件型別時查找的動作,並將需要後續處理的一併資料紀錄起來。
index tag content
: : :
03 07 (class tag) 0004 (name index)
4.1.2. Super class resolution 及 Interface resolution
在 JAVA 語言中,其物件導向的特性具有繼承及介面功能(如 1.2 說明),而在物件型別 的結構中(Class Format),裡面有兩個項目分別描述這個物件型別繼承的父物件型別為何以 及實作的介面有哪些,這邊解析的動作會透過查找(Resolution)的方式建立此物件型別的父 物件型別及有實作的介面資訊,並更新至 XRT 資料結構中。
4.1.3. Field_info/Method_info structure resolution
圖16. Field_info/Method_info structure resolution 演算法流程
上圖 16 是如何把某一個物件型別的 Field_info 及 Method_info 加入 XRT 的演算法,
其中解析的欄位表示屬於目前解析的物件型別中所屬的 Field Data 或是 Method。因為我 們使用的是 lazy 的方式去決定解析物件型別的時機,所以當別人有參照使用到此物件型 別的 Field Data 或 Method 時,會先幫在此物件型別建立 Field_info 及 Method_info 的欄 位並填入部分資訊,等到真正解析此物件型別時才會將正確的參照資料(Reference Data)
Search the method/field data in this class’s XRT
Modify reference data
Add the method/field data to this class’s XRT No
Yes
No
Yes Check the
method/field data is exist
Check all
methods/field data
finished
填入,所以當我們建立 Field_info 及 Method_info 時也要確認其參照資料是否已建立,這 邊參照資料對於 Field Data 其 32bit 的內容代表的意義為所屬的物件型別、屬性及其相對 於產生物件後,相對物件在記憶體中起位置的位移量,對於 Method 則是要表是其所屬 的物件型別及執行的位元組碼在執行映像檔(Run Time Image)上的位置,不過在 Method 的參照資料處理上在建立的是物件型別跟介面會有些微不同的處理,詳細不同在 4.3 節 關於介面部份會有更進一步的說明,演算法流程如圖 16。
4.1.4. Reference field/method resolution
圖17. Reference field/method resolution 演算法流程 Search reference method/field
data in its class’s XRT
Store the address about reference data
Add reference method/field data to its class’s XRT and store reference data [class id | 0x0000]
No
Yes
No
Yes Check the reference
method/field data is exist
Check all reference methods/field data finished
建立,並在參照資料(reference data)內填入[Class ID | 0x0000],最後再將指向參照資料的 位址做紀錄,之後一併整理至 Class Simple Table 中,4.1.7 會為 Class Simple Table 的功能做 解釋。
4.1.5. Class data resolution
此資訊是列在常數索引區段中的 class tag 中,這部分的資訊透過查找後也會一併整理成 class info 至 Class simple table,class info 如圖 18、表 1,之所以會有維度資訊是因為在常數 索引區段中關於陣列資訊也會以 class tag 表示,但最後這 class info 資訊並不會存放在 XRT 資料結構中,因為這資訊僅會在該物件型別的方法中像是 newobj、anewarray...等等的 bytecode 使用到。
圖18. Class info 的資料表示
表 1 Class info 中的 Type 列舉說明
Definition type dimension Class ID
Space (bit) 8 8 16
Primitive type expressions Object 0
Boolean 4
Char 5
Float 6
Double 7
byte 8
Short 9
Integer 10
Long 11
4.1.6. Ldc data resolution
此資訊是取出列在常數索引區段中的 Integer、Float 及 String 的 tag 中所記載的資訊,一 樣會透過查找的方式將這些資訊存到 XRT 的資料結構中,為了之後當 JAVA 程式執行到 Ldc 的指令時,可以透過發出中斷觸發 Ldc 指令對應的 ISR,再將資料傳回 JAVA 處理器的堆疊 上,以完成對 Ldc bytecode 的執行,所以需要在解析的階段,先將這些資訊整理至 XRT 的 Ldc data 中。
4.1.7. Run time image 格式介紹
最後要介紹的是完成解析的物件型別檔所產出的 run time image 結構,對 run time image 我們主要分為兩個部分,上半部稱為 class simple table,在 class simple table 中我們可以再細 分切為三塊,最前面是我們自訂的 magic number 佔 4 個 byte,接著會使用每 2 個 byte 為一個 欄位的方式,使用與常數索引區段欄位相同的個數,目的在於當 bytecode 使用的 Operand 指 的是常數索引區段上的索引值時,可以直接查找到其對應的資料,這邊內容存放的是一個索 引值,它指向位在第三塊上的資料,而在第三塊上的資料分為兩種,一種是物件型別方法所 會參照到的 method 及 field data,在這邊會以 32bit 來表示其參照資料(reference data)所在 記憶體的位置,第二種是直接存放 4.1.5 所提到的 class info,下半部則是將物件型別中所有 的方法直接貼入,這邊在貼入時每個方法僅會保留 max_stack、max_local 及 bytecode 的資訊,
最後產生的格式如圖 19 所示。
圖19. 實際 run time image 格式範例