Code-copying 主要是為了降低一個 basic block 中的 instruction dispatch overhead 來勁一部提升 direct-threading 的表現. 實作概念就是將模擬各個指令之程式碼的起始記憶體位址與終止記憶體位址紀錄於陣列中,程式碼其實就是一串 machine code,接著建立一個可讀寫的記憶體空間,按照 basic block 中的指令順序,一一將指令之程式碼寫入該記憶體空間。執行時就直接執行該記憶體空間中的一連串 machine code。
通過 code-copying 來的第一個好處就是減少 jump 指令次數,而且出現在這些 copying code 中的 jump 的指令更好預測。
另一個好處則和 cache locality 有關,過往在非連續的記憶體位址中調用某一指令之程式碼,由於 cache 大小有限,當兩段程式碼之記憶體位址格的太遠時,就會發生 cache miss。然而,在 code-copying 機制中,一連串被調用的指令程式碼記憶體位址都是連續的,這樣的情況大大降低 cache miss 的機率。
在 decode 後可以得知 basic block 中含有幾道指令,並以此算出這個 basic block 需要的 準備幾個 memory page 來將指令程式碼複製進去。
陣列 handle_ENTRY
紀錄了所有程式碼之起始記憶體位址,陣列 handle_END
則紀錄終止記憶體位址。
按照 basic block 中的指令順序,一一將指令之程式碼寫入配置好的記憶體空間中。
程式碼都寫入記憶體空間後,將回傳指令寫於最後面,且回傳指令 size 依照硬體架構而定。
在呼叫外部函數時,必須利用絕對地址
來呼叫,相對地址是相對於目前程式碼所在位置,和 code-copying 後的程式碼所在位置並不同。如果用相對地址來呼叫,會跑到不對的記憶體位置執行,會造成 segmentation fault.