第三章 Temporal Multithreading 系統架構
3.3. 系統軟體
3.3.1. 呼叫方法流程
類別方法的呼叫是透過 Java 位元組碼 invoke 相關指令來實作,包含 invokevirtual、
invokespecial 等。而若方法為靜態(static)則是使用 invokestatic 來呼叫。而當 JAIP 執行 invoke 相關指令,會經由 Decode Stage 經過解碼發現是要呼叫方法時,會啟動 Dynamic
class NewThread extends Thread { public void run() {
// override this method }
}
public class Thread1 {
public static void main(String[] args){
NewThread t = new NewThread ();
t.start();
} }
class NewThread implements Runnable { public void run() {
// implement this method }
}
public class Thread2 {
public static void main(String[] args){
32
Resolution Unit。而 Dynamic Resolution Unit 的狀態改變如圖 5,開始時都會停在 Normal 的狀態等待被啟動,而一旦發現是要執行呼叫方法時,會依據 Decode Stage 所傳過來的 相關訊號線以及此次 invoke 指令的參數。此時 Dynamic Resolution Unit 會依照這些相關 資訊來查找在處理器上保存的 Class Symbol Table 與 Cross Reference Table。
Cross Reference Table
Normal Method Descriptor Class ID
Class ID Method ID Method-List Pointer Java bytecodes
…
Class Symbol Table
reference entry1
reference entry2
reference entry3
reference entry4
….
matches the class ID of objectref
Method Area Manager
Cross Reference Table
Native Method 0x80000000
0xFF Arg
Size
Return Size
ISR Sub-ID 0xFFFFFFFF
Normal Method Descriptor Class ID
Class ID Method ID Method-List Pointer
Inter-process Communication
Interrupt Service Routine
圖 25. 呼叫方法流程圖
如圖 25 所示,Dynamic Resolution Unit 會根據 invoke 指令的參數來查找該類別的 Class Symbol Table,而在此表格內的每一個欄位所存放的資料代表指向 Cross Reference Table 位址。而透過這些位址我們可以取得在 Cross Reference Table 上所要呼叫的方法資 訊。而方法資訊區分為兩種(Normal method 與 Native method)。而在 Normal method 中所 存放的資訊包含 Descriptor、類別編號,實作類別編號、方法編號以及 Method-List Pointer。由於 Java 程式語言中支援繼承與實作的機制,因此同一個方法可能會被不同的 類別所實作,因此在類別解析器在解析類別的時候,會將被不同類別所實作的同一方法 串成一組 Method-List,使得 Dynamic Resolution Unit 在查找正確的呼叫方法時,只要透 過類別編號在 Method-List 上找尋真正所實作的方法即可。因此 Method-List Pointer 是指 向下一個被覆寫的相同方法在 Cross Reference Table 裡的欄位。而 Native method 所存放
33
的資訊包含參數個數、回傳值數量以及在系統軟體上的原生方法編號。
以圖 25 為例,第一次的 invokevirtual 先查找 Class Symbol Table 的欄位 1 資訊,並 依照此資訊索引到 Cross Reference Table 的方法資訊,發現此次呼叫的方法為 Normal method,然而此次取得的方法資訊在類別編號上並不相同,必須開始查找此方法的 Method-List。因此直接取得此方法資訊中的 Method-List Pointer 而並不會取出此方法的 編號。之後取出下一個方法資訊,相同的一開始就先比對類別編號是否相同,而若發現 類別編號相同時,即取出此方法資訊中的類別編號與方法編號,並將此資訊傳入 Method Area Manager[29]進行 Dynamic Method Loading 機制(如圖 26 所示)與更替 JAIP 所執行的 方法。而第二次的 invokevirtual 先查找 Class Symbol Table 的欄位 3 資訊並憑此索引到 Cross Reference Table 的方法資訊,發現此次呼叫的方法資訊第一欄資訊為 0x80000000,
憑此判斷是為 Native method。所以並不用進行查找 Method-List 的工作,而是直接取得 第二欄的資訊,依據參數個數調整 Inter-process communication 所使用的參數暫存器 [31],並透過這個介面來執行 RISC 處理器上的 Interrupt Service Routine。而當系統軟體 接到 JAIP 的中斷要求後,會先檢查中斷編號,若為執行原生方式則系統軟體會從 JAIP 暫存器上取得原生方法編號並執行其方法,執行完畢後將結果寫回 JAIP 並告知已完成。
Dynamic Method Loading
Is the CST in 1st-level Method Area?
Check Method Lookup Table yes
Is the Method Image in 1st-level
Method Area?
no
Get base block index of the class runtime image in MACB
yes Check Class Lookup Table
done
no
Load the Class Symbol Table into CSTCB
Load the Method Image into MICB Dynamic resolution unit
retrieves invoked Class ID
& Method ID
Trigger Method Area Manager
圖 26. Dynamic Method Loading 流程圖
34