国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

QEMU 用戶模式(User Mode)流程及源碼分析 (三)

2022-07-24 00:35 作者:范文捷  | 我要投稿

??

TCG中間碼生成完畢后,由tcg_gen_code函數(shù)負責將 TCG 中間碼翻譯為 HOST 平臺代碼,這里以 GUEST 端為 x86_64, HOST 端為 ARM64 為例。

tcg_gen_code

tcg_gen_code的實現(xiàn)位于tcg/tcg.c文件內(nèi),總共有2個參數(shù),類型分別是TCGContext和TranslationBlock。其中TranslationBlock類型參數(shù)tb主要是用來表示翻譯的代碼存儲的位置,該位置是tb->tc.ptr,之后會將其值賦給TCGContext類型參數(shù)s的成員變量code_buf保存,參數(shù)tb在翻譯過程中的使命就結(jié)束了,TCGContext類型參數(shù)s貫穿整個翻譯流程。 TCGContext內(nèi)存儲TCG中間碼,參數(shù)s內(nèi)的ops即為存儲的每條TCG中間碼,通過遍歷每條中間碼,并根據(jù)HOST端類型翻譯成本機指令,并寫入到code_buf內(nèi)。

中間碼翻譯示例

GUEST端為x86_64時,存儲CPU狀態(tài)的結(jié)構(gòu)體類型為CPUX86State,在翻譯的HOST代碼中,存儲CPU狀態(tài)的結(jié)構(gòu)體指針地址值會存入指定寄存器。該寄存器由HOST端決定,例如,當HOST端為x86_64時,該寄存器為rbx;當HOST端為ARM64時,該寄存器為x19。以此來建立GUEST端和HOST端寄存器的映射。 例如,GUEST端為x86_64時,eip寄存器對應(yīng)的eip成員變量在CPUX86State結(jié)構(gòu)體的偏移為sizeof(target_ulong[CPU_NB_REGS])=108,那么當HOST端為ARM64時,eip被翻譯為[x19, #108];當HOST為x86_64時,eip被翻譯為108(%rbx)。

為了優(yōu)化翻譯的代碼,避免不必要的內(nèi)存讀取,每個代碼塊內(nèi),當且僅當GUEST寄存器在首次訪問和被同步時,才按照上述方式翻譯,并將值從內(nèi)存中加載進HOST端某個空閑寄存器,并建立該GUEST端寄存器與HOST端某個空閑寄存器的映射。例如,如下代碼中,rcx在CPUX86State的偏移為8,那么GUEST端代碼

被翻譯到ARM64的HOST端時,可能為

對于上一章提到的tcg中間碼

在HOST端為ARM64時,翻譯結(jié)果為


QEMU 用戶模式(User Mode)流程及源碼分析 (三)的評論 (共 條)

分享到微博請遵守國家法律
霍山县| 泾源县| 专栏| 商河县| 永安市| 祁东县| 南乐县| 汉川市| 那坡县| 陆川县| 闵行区| 景德镇市| 乌苏市| 苍南县| 达尔| 河北区| 淅川县| 阆中市| 田阳县| 洛扎县| 兴化市| 江达县| 三门县| 张掖市| 缙云县| 锡林郭勒盟| 兰西县| 将乐县| 江津市| 台南市| 扬州市| 临湘市| 卓尼县| 新巴尔虎左旗| 泸西县| 浑源县| 普格县| 台湾省| 若尔盖县| 桃园市| 凤冈县|